代码之家  ›  专栏  ›  技术社区  ›  eddiewastaken

Java中的基本加密算法不解密

  •  0
  • eddiewastaken  · 技术社区  · 7 年前

    byte[] 包含音频,大小512。

    下面是我的加密函数:

    //Encrypt 64bit/8byte buffer with 128bit/16byte key
    public byte[] encrypt(int[] data, int[] key) { 
        int x = data[0]; 
        int y = data[1]; 
        ByteBuffer encrypted = ByteBuffer.allocate(8);
        int sum = 0; 
        int constant = 0x9e3779b9; //magic constant
    
        for (int k = 0; k < 32; ++k) { 
            sum += constant; 
            x += (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
            y += (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
        }
        encrypted.putInt(x);
        encrypted.putInt(y);
        return encrypted.array();
    }
    

    public byte[] decrypt(int[] data, int[] key) { 
        int x = data[0]; 
        int y = data[1]; 
        ByteBuffer decrypted = ByteBuffer.allocate(8);
        int sum = 0xC6EF3720; //32*delta
        int constant = 0x9e3779b9; //magic constant
    
        for (int k = 0; k < 32; ++k) { 
            x -= (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
            y -= (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
            sum -= constant; 
        }
        decrypted.putInt(x); 
        decrypted.putInt(y);
        return decrypted.array();
    }
    

    ByteBuffer unwrapEncrypt = ByteBuffer.allocate(512);
    int[] encryptionKey = {55555, 8888, 123857, 912029};
    
    //block is a byte[] with length 512
    ByteBuffer plainText = ByteBuffer.wrap(block);
    for (int j = 0; j < block.length / 8; j++) {
        //Initiate array for int pairs
        int[] plainTextInts = new int[2];
        plainTextInts[0] = plainText.getInt();
        plainTextInts[1] = plainText.getInt();
        //Encrypt and store
        unwrapEncrypt.put(encrypt(plainTextInts, encryptionKey));
    }
    

    和解密调用:

    ByteBuffer audioToPlay = ByteBuffer.allocate(512);
    int[] decryptionKey = {55555, 8888, 123857, 912029};
    
    //audio is a byte[] with length 512
    ByteBuffer cipherText = ByteBuffer.wrap(audio);
    for (int j = 0; j < audio.length / 8; j++) {
        int[] plainTextInts = new int[2];
        //Initiate array for int pairs
        plainTextInts[0] = cipherText.getInt();
        plainTextInts[1] = cipherText.getInt();
        //Decrypt and store
        audioToPlay.put(decrypt(plainTextInts, decryptionKey));
    }
    

    0 回复  |  直到 7 年前
        1
  •  1
  •   halfbit    7 年前

    我觉得你的 decrpyt() 方法进行比较 Wikipedia' s description of TEA -= 操作员。以下几点似乎对我有用:

    public byte[] decrypt(int[] data, int[] key) { 
        int x = data[0]; 
        int y = data[1]; 
        ByteBuffer decrypted = ByteBuffer.allocate(8);
        int sum = 0xC6EF3720; //32*delta
        int constant = 0x9e3779b9; //magic constant
    
        for (int k = 0; k < 32; ++k) { 
            y -= (x << 4 & 0xfffffff0) + key[2] ^ x + sum ^ (x >> 5 & 0x7ffffff) + key[3]; 
            x -= (y << 4 & 0xfffffff0) + key[0] ^ y + sum ^ (y >> 5 & 0x7ffffff) + key[1]; 
            sum -= constant; 
        }
        decrypted.putInt(x); 
        decrypted.putInt(y);
        return decrypted.array();
    }