Java 斑点算法不起作用
我试图在java中实现Speck 64位块/128位密钥密码。我被加密/解密算法困住了。我的解密算法无法正确解密密文 我的实施:Java 斑点算法不起作用,java,algorithm,encryption,cryptography,block-cipher,Java,Algorithm,Encryption,Cryptography,Block Cipher,我试图在java中实现Speck 64位块/128位密钥密码。我被加密/解密算法困住了。我的解密算法无法正确解密密文 我的实施: 加密: int m = 4; //key words int T = 27; //rounds int alpha = 8; //alpha int beta = 3; //beta int x,y; int[] l = new int[2*T], k = new int[T]; /* *************** KEY EXTENSTION *********
- 加密:
int m = 4; //key words int T = 27; //rounds int alpha = 8; //alpha int beta = 3; //beta int x,y; int[] l = new int[2*T], k = new int[T]; /* *************** KEY EXTENSTION ***************** */ for(int i = 0; i < T-1; i++) { l[i+m-1] = (k[i] + rotateRight(l[i], alpha)) ^ i; k[i+1] = rotateLeft(k[i], beta) ^ l[i+m-1]; //System.out.println(k[i]); } /* *************** ENCRYPTION ********************* */ for(int i = 0; i < T; i++) { x = (rotateLeft(x, alpha) + y) ^ k[i]; y = rotateRight(y, beta) ^ x; //System.out.println(y); }
intm=4//关键词 int T=27//轮 intα=8//阿尔法 intβ=3//贝塔 int x,y; int[]l=新int[2*T],k=新int[T]; /*****************密钥扩展*************************/ 对于(int i=0;i
- 解密:
/* *************** KEY EXTENSTION ***************** */ for(int i = 0; i < T-1; i++) { l[i+m-1] = (k[i] + rotateRight(l[i], alpha)) ^ i; k[i+1] = rotateLeft(k[i], beta) ^ l[i+m-1]; //System.out.println(k[i]); } /* *************** DECRYPTION ********************* */ for(int i = T-1; i >= 0; i--) { y = rotateRight(y, beta) ^ x; x = (rotateLeft(x, alpha) - y) ^ k[i]; //System.out.println(y); }
/****************键扩展**********************/ 对于(int i=0;i
=0;i--){ y=旋转光(y,β)^x; x=(rotateLeft(x,alpha)-y)^k[i]; //系统输出打印项次(y); }
x和y通过函数装箱(>amount | number最终计算出来)进行初始化。我的解密算法应该如下所示:
for(int i = T-1; i >= 0; i--) {
y = rotateRight(x ^ y, beta);
x = rotateLeft((x ^ k[i]) - y, alpha);
}
我意外地交换了加密算法中的旋转函数。这是正确的形式:
for(int i = 0; i < T; i++) {
x = (rotateRight(x, alpha) + y) ^ k[i];
y = rotateLeft(y, beta) ^ x;
}
for(int i=0;i
附录C中的文章末尾有测试向量。首先检查加密是否有效,然后检查解密。除了缺少的旋转函数外,似乎一切都很简单。添加了旋转函数。但我的旋转函数在另外两种密码下工作。我想是XTEA和RC5它们很好。@Amphoru-你能用斑点测试向量验证算法吗?我很确定测试向量是错误的(或者论文作者遗漏了必要的信息)。我修改了他们的参考实现,以在ECB模式下操作密码,但无法得到测试向量结果。@MaartenBodewes-如果你有时间,请看一看。我花了两天时间试图得到发布的测试向量结果,但似乎做不到。GitHub向SuperCop re添加了一个main
引用实现,也不能得到测试向量结果。
for(int i = T-1; i >= 0; i--) {
y = rotateRight(x ^ y, beta);
x = rotateLeft((x ^ k[i]) - y, alpha);
}
for(int i = 0; i < T; i++) {
x = (rotateRight(x, alpha) + y) ^ k[i];
y = rotateLeft(y, beta) ^ x;
}