实验代码在这里:实验代码
实验目的- 统计DES算法在密钥固定情况,输入明文改变1位、2位,。。。64位时。输出密文位数改变情况。
- 统计DES算法在明文固定情况,输入密钥改变1位、2位,。。。64位时。输出密文位数改变情况。
为了具有客观性,各小题需要对多次进行统计,并计算其平均值。
主要使用字符串String和字节数组byte[]
主要有5个变量,对于第一问:统计DES算法在密钥固定情况,主要变量是:
| 明文 | des_input |
|---|---|
| 密文 | des_output |
| 改变后的明文 | randDes_input |
| 改变后的密文 | randDes_output |
| 密钥 | des_key |
上述5个变量分别都有字符串和byte[] 两种形式,字符串是以二进制形式存储,用于比对不同和随机改变位数;byte[]用于加密。
第二问同样。
过程简述其实逻辑是很简单的啦,主要是数据形式的转换而已。
这里就不讲了。
实验结果 改变明文,固定密钥情况如下:改变明文,固定密钥情况如下:
平均每变化1位,密文变化25.4位
平均每变化2位,密文变化27.9位
平均每变化3位,密文变化26.8位
平均每变化4位,密文变化29.2位
平均每变化5位,密文变化30.2位
平均每变化6位,密文变化27.7位
平均每变化7位,密文变化26.1位
平均每变化8位,密文变化28.1位
平均每变化9位,密文变化28.1位
平均每变化10位,密文变化29.2位
平均每变化11位,密文变化30.2位
平均每变化12位,密文变化29.8位
平均每变化13位,密文变化29.0位
平均每变化14位,密文变化27.5位
平均每变化15位,密文变化28.1位
平均每变化16位,密文变化30.2位
平均每变化17位,密文变化27.9位
平均每变化18位,密文变化26.6位
平均每变化19位,密文变化27.2位
平均每变化20位,密文变化29.4位
平均每变化21位,密文变化26.9位
平均每变化22位,密文变化28.6位
平均每变化23位,密文变化27.1位
平均每变化24位,密文变化26.4位
平均每变化25位,密文变化27.6位
平均每变化26位,密文变化28.1位
平均每变化27位,密文变化28.4位
平均每变化28位,密文变化28.5位
平均每变化29位,密文变化25.7位
平均每变化30位,密文变化29.4位
平均每变化31位,密文变化28.8位
平均每变化32位,密文变化27.2位
平均每变化33位,密文变化30.3位
平均每变化34位,密文变化27.9位
平均每变化35位,密文变化27.1位
平均每变化36位,密文变化29.3位
平均每变化37位,密文变化29.8位
平均每变化38位,密文变化29.9位
平均每变化39位,密文变化27.5位
平均每变化40位,密文变化26.7位
平均每变化41位,密文变化26.4位
平均每变化42位,密文变化29.0位
平均每变化43位,密文变化27.4位
平均每变化44位,密文变化28.8位
平均每变化45位,密文变化29.5位
平均每变化46位,密文变化27.6位
平均每变化47位,密文变化27.5位
平均每变化48位,密文变化27.4位
平均每变化49位,密文变化27.4位
平均每变化50位,密文变化27.2位
平均每变化51位,密文变化26.3位
平均每变化52位,密文变化29.2位
平均每变化53位,密文变化26.5位
平均每变化54位,密文变化28.4位
平均每变化55位,密文变化28.6位
平均每变化56位,密文变化28.6位
平均每变化57位,密文变化27.6位
平均每变化58位,密文变化30.3位
平均每变化59位,密文变化30.5位
平均每变化60位,密文变化29.5位
平均每变化61位,密文变化27.1位
平均每变化62位,密文变化28.6位
平均每变化63位,密文变化26.9位
平均每变化64位,密文变化27.3位
平均每变化1位,密文变化25.1位
平均每变化2位,密文变化28.0位
平均每变化3位,密文变化28.2位
平均每变化4位,密文变化26.0位
平均每变化5位,密文变化26.8位
平均每变化6位,密文变化28.3位
平均每变化7位,密文变化27.6位
平均每变化8位,密文变化29.0位
平均每变化9位,密文变化27.9位
平均每变化10位,密文变化25.7位
平均每变化11位,密文变化29.0位
平均每变化12位,密文变化27.9位
平均每变化13位,密文变化27.6位
平均每变化14位,密文变化27.8位
平均每变化15位,密文变化27.5位
平均每变化16位,密文变化27.0位
平均每变化17位,密文变化27.4位
平均每变化18位,密文变化26.1位
平均每变化19位,密文变化28.0位
平均每变化20位,密文变化27.4位
平均每变化21位,密文变化27.8位
平均每变化22位,密文变化26.6位
平均每变化23位,密文变化29.8位
平均每变化24位,密文变化27.5位
平均每变化25位,密文变化29.7位
平均每变化26位,密文变化28.0位
平均每变化27位,密文变化26.8位
平均每变化28位,密文变化28.5位
平均每变化29位,密文变化25.4位
平均每变化30位,密文变化28.4位
平均每变化31位,密文变化29.8位
平均每变化32位,密文变化27.4位
平均每变化33位,密文变化28.3位
平均每变化34位,密文变化26.2位
平均每变化35位,密文变化26.5位
平均每变化36位,密文变化28.0位
平均每变化37位,密文变化26.0位
平均每变化38位,密文变化27.8位
平均每变化39位,密文变化28.6位
平均每变化40位,密文变化29.1位
平均每变化41位,密文变化27.2位
平均每变化42位,密文变化28.6位
平均每变化43位,密文变化28.7位
平均每变化44位,密文变化26.5位
平均每变化45位,密文变化29.6位
平均每变化46位,密文变化30.5位
平均每变化47位,密文变化30.2位
平均每变化48位,密文变化28.2位
平均每变化49位,密文变化28.2位
平均每变化50位,密文变化26.4位
平均每变化51位,密文变化28.6位
平均每变化52位,密文变化27.7位
平均每变化53位,密文变化29.4位
平均每变化54位,密文变化26.0位
平均每变化55位,密文变化27.0位
平均每变化56位,密文变化27.1位
平均每变化57位,密文变化27.2位
平均每变化58位,密文变化27.8位
平均每变化59位,密文变化28.6位
平均每变化60位,密文变化28.6位
平均每变化61位,密文变化28.9位
平均每变化62位,密文变化29.2位
平均每变化63位,密文变化27.8位
平均每变化64位,密文变化29.8位
主函数:
public static void changeCipher(byte[] des_key,byte[] des_input,byte[] des_output)
public static void changeInput(byte[] des_key,byte[] des_input,byte[] des_output)
新建类BitsArray,主要使用的静态方法:
public static String ByteArrayToHex(byte[] bs) public static byte[] binaryToByteArray(String inHex) public static int compare(String output1,String output2) public static String bitsToString(byte[] bs) public static String toggleStringBit(String str,int number)麻烦的地方
麻烦的地方在于怎么选择数据形式,byte[]不方便改变位数,string不方便进行加密,所以做了很多工具函数用于把byte[]和string格式的转换。
转换主要是把以string形式存储的64位二进制转成byte[8],8位二进制对应一个byte。这就出现了一个问题,如果一个二进制数是11000000,转成byte就是一个负数,byte再转成String,那么它就不再是8位,可能是16位,24位(java使用Integer.toBinaryString()可以试一下)。这就造成了麻烦。
**
* 把字节数组转换成字符串
* @param bs
* @return
*/
public static String bitsToString(byte[] bs) {
String str="";
// 这里的8是因为一位byte有8位
for(int i=0;i<8;i++)
{
if(bs[i]<0) {
// 在转换的时候先鉴别是否是负数,如果是,就加上128转成正数(128:2^8)机器码的知识
//这样解决了存进来是负数,换出去位数不能控制的问题
bs[i]+=128;
}
String s=Integer.toBinaryString(bs[i]);
if(s.length()<8) {
int total=8-s.length();
for(int j=0;j


