Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 斑点算法不起作用_Java_Algorithm_Encryption_Cryptography_Block Cipher - Fatal编程技术网

Java 斑点算法不起作用

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 *********

我试图在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 ***************** */
    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);
    }
    

xy通过函数装箱(>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;
    }