https://www.ichunqiu.com/battalion?t=1&r=70899
+ + + + + + + + + + +
BB84偏振协议解析
作者:安徽问天量子科技股份有限公司-量子信息教育创新平台产品团队
解题的关键在于以下几点:
-
根据参考资料,解析csv文件,获取安全密钥序列; -
根据线性同余理论从已得到的安全密钥序列中,获取最终用于加密的安全密钥。
1. 根据参考资料,理解EPC1、APD1-APD4数据的含义
-
EPC1:为Alice端根据四个偏振量子态调制编码的随机数序列(1,2,3,4),序列长度为n; -
APD1-APD4:为Bob端四个探测器响应序列(0,1),每组序列长度为n,共四组,序列编号分别为1,2,3,4;
2. 根据参考资料,对于csv文件数据需要进行如下的处理及计算
2.1 获取有效探测序列
2.2 在有效探测序列基础上,获取对基成功序列
-
EPC1为1,APD1或APD2为1; -
EPC1为2,APD1或APD2为1; -
EPC1为3,APD3或APD4为1; -
EPC1为4,APD3或APD4为1;
2.3 计算误码率
-
EPC1为1,APD2为1; -
EPC1为2,APD1为1; -
EPC1为3,APD4为1; -
EPC1为4,APD3为1;
2.4 计算成码率(安全密钥量)
3. 根据线性同余理论从已得到的安全密钥序列中,选取生成最终用于加密的安全密钥,并完成解密工作
-
根据“一次一密”关键词,可知悉:密钥长度=明文长度; -
根据“流密码”关键词,可知悉:加密采用对称加密方式,加密和解密时使用同一密钥,且进行异或运算; -
根据“UTF8编码方式”关键词,可知悉:最终需通过UTF8进行编码得到明文。
// ciphertext密文,srcLen明文长度
string ciphertext = "自定义的密文信息";
char[] charArr = ciphertext.ToArray();
int srcLen = ciphertext.Length / 2;
byte[] byteData = new byte[srcLen];
OriInfoLen = srcLen * 8;
// hexArr:将十六进制数据两两一组,便于后面的异或运算
List<string> hexArr = new List<string>();
for (int i = 0; i < srcLen; i++)
{
string tempStr = $"{charArr[i * 2]}{charArr[i * 2 + 1]}";
hexArr.Add(tempStr);
}
// orderKeys线性同余得到二进制数组
int[] orderKeys = GetRandomKey(tmp).ToArray();
// OriInfoLen为密文长度的4倍
for (int i = 0; i < OriInfoLen; i++)
{
int value = orderKeys[i * 8 + 7] + orderKeys[i * 8 + 6] * 2 + orderKeys[i * 8 + 5] * 4 + orderKeys[i * 8 + 4] * 8 + orderKeys[i * 8 + 3] * 16 + orderKeys[i * 8 + 2] * 32 + orderKeys[i * 8 + 1] * 64 + orderKeys[i * 8] * 128;
nums.Add(value);
}
/// <summary>
/// 线性同余得到密钥
/// </summary>
/// <param name="keyPool"></param>
/// <returns></returns>
List<int> GetRandomKey(int[] keyPool)
{
int A = 1709;
int B = 2003;
int M = keyPool.Length;
int indexBegin = 17;
// newKey: 经线性同余计算得到的索引所对应的的数据
List<int> newKey = new List<int>();
newKey.Add(keyPool[indexBegin]);
for (int i = 1; i < OriInfoByteLen; i++)
{
int res = (A * indexBegin + B) % M;
newKey.Add(keyPool[res]);
indexBegin = res;
}
return newKey;
}
for (int i = 0; i < OriInfoLen; i++)
{
int value = Convert.ToInt32(hexArr[i], 16);
int res = value ^ nums[i];
byteData[i] = Convert.ToByte(res);
}
var plaintext = Encoding.UTF8.GetString(byteData);
根据解题步骤所编写的软件:
+ + + + + + + + + + +
原文始发于微信公众号(春秋伽玛):官方WP | 量子密钥分发协议赛题bb84解析