java - Blob 算法不起作用

标签 java algorithm encryption cryptography block-cipher

我正在尝试在 Java 中实现 Speck 64 位 block /128 位 key 密码。我被困在加密/解密算法上。我的解密算法无法正确解密密文。

我的实现:

  • 加密:

    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);
    }
    
  • 解密:

    /* *************** 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);
    }
    

xy 通过函数装箱初始化(<- 有点奇怪):

    x = boxing(plainText, 0, 1);
    y = boxing(plainText, 1, 2);

public static int boxing(int[] content, int i, int count) {
    int temp[] = new int[count];
        temp[i] |= content[i*4] & 0xff;
        temp[i] = temp[i] << 8 | content[i*4+1] & 0xff;
        temp[i] = temp[i] << 8 | content[i*4+2] & 0xff;
        temp[i] = temp[i] << 8 | content[i*4+3] & 0xff;
        //System.out.println(temp[from]);

    return temp[i];
}

请注意,content 是 8 个字符的 int 数组。

我把解密放在加密之后,所以我可以看看这个算法是否真的有效,但它不是,我也不知道为什么。 (在使用解密之前,我将变量重置为其正确的值)。

引用资料

编辑:

  • 旋转函数:

    public static int rotateLeft(int number, int amount) {
       return number << amount | number >>> (32-amount);
    }
    public static int rotateRight(int number, int amount) {
       return number >>> amount | number << (32-amount);
    }
    

最佳答案

终于明白了。我的解密算法应该是这样的:

    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;
    }

关于java - Blob 算法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950555/

相关文章:

java - 两个进程之间的数据流

java - 弹出菜单项图标

c# - 最短单词列表算法

algorithm - Dijkstra 源到目标的有向加权图中的最短路径

encryption - 安全与认证 : SSL vs SASL

java - 使用工业级加密保护 Java 免受逆向工程

java - Java 中的哨兵值

java - 如何找到这两个函数的运行时间?

javascript - 保护 HTML/JavaScript 前端和后端之间的请求(身份验证)

java - java中的过滤集合