【问题标题】:TEA encryption and decryption implementationTEA加解密实现
【发布时间】:2018-01-28 12:22:48
【问题描述】:

我已经编写了加密和解密方法,以便能够加密纯文本或解密密文。但是,我不确定如何成功实现这一点,因为将 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

【问题讨论】:

  • 四个bytes 组成一个int

标签: java encryption


【解决方案1】:

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


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

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


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

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

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


除了密钥之外,解密是另一种方式。您首先如上所述创建密钥。然后解码 base 64,解密二进制结果,然后使用 String 构造函数获取字节数组来检索明文。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2021-05-02
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多