问题背景 - 源于一次作业
作业
编程统计DES算法中明文(或密钥)改变1位,2位。。。64位的情况下,密文位数的变化量情况具体要求: 编程实现
1. 在密钥不变情况下,明文改变1位,2位。。。64位,观察并统计密文位数变化规律。
2. 在明文不变情况下,密钥改变1位,2位。。。64(56)位,观察并统计密文位数变化规律。
为了使统计具有客观性,上述每种情况可以重复多次,然后求平均值。
问题
使用pyDes库进行编程,但该库中输入的原文与密钥是以字节(Byte)的单位的,而作业要求是改变位(bit)。想到用字节与进制间的转换解决该问题。于是有了关于题目的研究。
实际研究
查了这么多资料,似乎字符串是很少一步转换成2进制的。要用16进制在中间桥接。即转换过程为:字符<->16进制<->2进制。
字符 <-> 16进制
首先可以学习 binascii 这个库。这个库是用于进制与ASCII之间的转换。
我主要用到以下两个方法:binascii.hexlify(data) // 字符串<->16进制(还是字符串)
举个粟子:
binascii.unhexlify(hexstr) // 就是把上面的一串16进制的字符串变回字符形式
系统学习binascii -> python手册大法
16 <-> 2进制
这里学习python的进制转换。可以发挥你的想像力各种bin、hex、int、chr、ord天花乱坠地嵌套使用吧。
粟子:(图片中代码有错,正确的是bin(int(hex_data,16))
)
右侧学习链接强推 -> 字符转换为二进制及进制之间转换
但使用上述进制转换方法要注意开头的前缀是否你所需要的,如这里的‘0b’,在我的编程中是多余的,所以要去掉。你可以使用切片等方法。这里推荐一个format的用法。
补充
当然实际还有很多方法可以解决进制与字符串转换的问题。我使用的只是其中一种,而且也还挺复杂的。但已经比我最初想的好了!
此外,在查资料学习的过程中,看到了一个直接转换的很溜的思想。在此补充给大家。
【下面代码节选自 -> C语言实现DES算法】
/*-------------------------------
字节转换成位函数
每8次换一个字节 每次向右移一位
和1与取最后一位 共64位
--------------------------------*/
void ByteToBit(bool *DatOut,char *DatIn,int Num) // OK
{
int i=0;
for(i=0;i< Num;i++)
{
DatOut[i]=(DatIn[i/8]>>(i%8))&0x01;
}
}
/*-------------------------------
位转换成字节函数
字节数组每8次移一位
位每次向左移 与上一次或
---------------------------------*/
void BitToByte(char *DatOut,bool *DatIn,int Num) // OK
{
int i=0;
for(i=0;i<(Num/8);i++)
{
DatOut[i]=0;
}
for(i=0;i< Num;i++)
{
DatOut[i/8]|=DatIn[i]<<(i%8);
}
}
-
总结
>
- 字符串<->16进制<->2进制
- 位运算
- pydes 、binascii 库的学习
- 进制间的转换命令
其他细节
附:py