TEA加密和解密实现

时间:2018-01-25 23:31:24

标签: java encryption

我已经编写了加密和解密方法,以便能够加密纯文本或解密密文。我不确定如何成功实现这一点,但是,由于将HEX和文本作为STRING并且不确定如何将它们转换为int数组,然后如何成功打印结果而不是一堆混乱的字母。我做错了什么?

以下代码是加密或解密的两种TEA方法:

public void encrypt (int[] block, int[] key) {
    int i = block[0];
    int j = block[1];
    int sum = 0;
    int delta = 0x9e3779b9;

    for (int k = 0; k < 32; k++) {
        sum += delta;
        i += (j << 4 & 0xffffff0) + key[0] ^ j + sum ^ (j >> 5 & 0x7fffffff)
                + key[1];
        j += (i << 4 & 0xfffffff0) + key[2] ^ i + sum ^ (i >> 5 & 0x7ffffff) 
                + key[3]; 
    }

    block[0] = i;
    block[1] = j;
}

public void decrypt (int[] block, int[] key) {
    int i = block[0];
    int j = block[1];
    int sum = 0;
    int delta = 0x9e3779b9;

    for (int k = 0; k < 32; k++) {
        i -= (i << 4 & 0xfffffff0) + key[2] ^ i + sum ^ (i >> 5 & 0x7ffffff)
                + key[3];
        j -= (j << 4 & 0xfffffff0) + key[0] ^ j + sum ^ (j >> 5 & 0x7ffffff)
                + key[1];
        sum -= delta;
    }

    block[0] = i;
    block[1] = j;
}

这是用户界面代码:

public void encryptionT() {
    p.plainText();
    String pText = input.next();
    p.hexNumber();
    String hexNum = input.next();
    byte hex[] = hexNum.getBytes();
    byte pTextBytes[] = pText.getBytes();
    byte[] encryptedPlainBase = Base64.getEncoder().encode(pTextBytes);
    System.out.println(encryptedPlainBase);

}

public void decryptionT() {
    p.cipherText();
    String cText = input.next();
    p.hexNumber();
    String hexNum = input.next();
    byte hex[] = hexNum.getBytes();
    byte cTextBytes[] = cText.getBytes();
    BigInteger hexBigInt = new BigInteger(1, hex);
    BigInteger plainBigInt = new BigInteger(1, cTextBytes);
    BigInteger cTextHexResult = hexBigInt.multiply(plainBigInt);
    byte[] decryptedCipherText = cTextHexResult.toByteArray();
    byte[] decryptedCipherBase = Base64.getDecoder().decode(decryptedCipherText);
    System.out.println(decryptedCipherBase);

编辑:

我尝试进行建议的编辑,但是出现以下错误。我不确定我是否只是不理解。enter image description here

1 个答案:

答案 0 :(得分:0)

哇,这是我第一次看到加密/解密的实现,其中实际的加密/解密完全被遗忘。

我首先会解释密钥 - 通常是从密钥开始,而不是明文,因为密钥通常可以重复用于其他消息。然而,TEA只接受密钥,而不是IV或nonce,因此使用相同的密钥加密多个消息将破坏密码。

必须首先将十六进制密钥解码为二进制。但是,您需要一个十六进制解码器。但是,这不包含在普通的Java包java.util中 - 例如使用相反,Apache编解码器库。这应该让您使用现在获得的一半大小的二进制密钥(十六进制字符的二进制编码)。

现在您需要将明文消息编码为二进制 - 即Java中的字节数组,您在pText.getBytes()中执行此操作。

现在你需要通过加密上面获得的二进制文件从明文消息中创建密文。

如果密文必须编码,如果您希望将密文视为文本,那么您是正确的。因此,在结果上使用base64编码是一种很好的做法 - 除非二进制密文也足够(Java I / O流和文件对二进制值很好),在这种情况下编码根本不是必需的。

解密除了密钥之外其他方式。您首先按照上面的说明创建密钥。然后解码基数64,解密二进制结果,然后使用带有字节数组的String构造函数来检索明文。

请注意,String#getBytesnew String(byte[])默认使用平台解码。您可能希望指定一个精确的编码,例如UTF-8,以便在平台之间兼容。