我已经编写了加密和解密方法,以便能够加密纯文本或解密密文。我不确定如何成功实现这一点,但是,由于将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
答案 0 :(得分:0)
我首先会解释密钥 - 通常是从密钥开始,而不是明文,因为密钥通常可以重复用于其他消息。然而,TEA只接受密钥,而不是IV或nonce,因此使用相同的密钥加密多个消息将破坏密码。
必须首先将十六进制密钥解码为二进制。但是,您需要一个十六进制解码器。但是,这不包含在普通的Java包java.util
中 - 例如使用相反,Apache编解码器库。这应该让您使用现在获得的一半大小的二进制密钥(十六进制字符的二进制编码)。
现在您需要将明文消息编码为二进制 - 即Java中的字节数组,您在pText.getBytes()
中执行此操作。
现在你需要通过加密上面获得的二进制文件从明文消息中创建密文。
如果密文必须编码,如果您希望将密文视为文本,那么您是正确的。因此,在结果上使用base64编码是一种很好的做法 - 除非二进制密文也足够(Java I / O流和文件对二进制值很好),在这种情况下编码根本不是必需的。
解密除了密钥之外其他方式。您首先按照上面的说明创建密钥。然后解码基数64,解密二进制结果,然后使用带有字节数组的String
构造函数来检索明文。
请注意,String#getBytes
和new String(byte[])
默认使用平台解码。您可能希望指定一个精确的编码,例如UTF-8,以便在平台之间兼容。