gpt4 book ai didi

javascript Triple des 加密值和 java Triple des 加密值不匹配为什么?

转载 作者:行者123 更新时间:2023-11-30 06:48:26 25 4
gpt4 key购买 nike

嗨,大家好,我有 java 代码,它为我生成三重加密代码,现在我尝试使用 crypto-js 在 javascript 上使用它,但这两个代码提供了不同的 key ,我不知道为什么以及如何获得相同的 key ,这是我的代码

 public String _encrypt(String message) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
System.out.println(bytesToHex(keyBytes));

SecretKey key = new SecretKeySpec(keyBytes, "TripleDES");
Cipher cipher = Cipher.getInstance("TripleDES");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] plainTextBytes = message.getBytes("utf-8");
byte[] buf = cipher.doFinal(plainTextBytes);

System.out.println(bytesToHex(buf));



byte [] base64Bytes = Base64.encodeBase64(buf);
String base64EncryptedString = new String(base64Bytes);

return base64EncryptedString;
}

public static String bytesToHex(byte[] in) {
final StringBuilder builder = new StringBuilder();
for(byte b : in) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}


public String _decrypt(String encryptedText) throws Exception {

byte[] message = Base64.decodeBase64(encryptedText.getBytes("utf-8"));

MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
SecretKey key = new SecretKeySpec(keyBytes, "DESede");

Cipher decipher = Cipher.getInstance("DESede");
decipher.init(Cipher.DECRYPT_MODE, key);

byte[] plainText = decipher.doFinal(message);

return new String(plainText, "UTF-8");
}

我的java脚本代码如下

 key = CryptoJS.SHA1(key);
console.log(key.toString());
var iv = String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0) + String.fromCharCode(0);
var ivHex = CryptoJS.enc.Hex.parse(iv);

var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivHex
};

var encrypted = CryptoJS.TripleDES.encrypt(pt, key, options);
var encryptedBase64 = encrypted.toString();
console.log(encryptedBase64);

var ct = {
ciphertext: CryptoJS.enc.Base64.parse(encryptedBase64)
};
var decrypted = CryptoJS.TripleDES.decrypt(ct, key, options);
console.log(decrypted.toString(CryptoJS.enc.Utf8));

键=“3ad5485e60a4fecd”消息=“textToEncrypt”

从java chKL5NVtBXesEKfNIokpdw加密得到==

从 javascript chKL5NVtBXeTFwswp882Vw 加密获取==

任何人都可以帮助我或告诉我为什么会发生这种情况。

最佳答案

两个代码存在多个差异:

  • 您可能使用不同的modes of operation 。 Java 使用 ECB,JS 使用 CBC。

    始终使用完全限定的密码字符串。

    Cipher.getInstance("TripleDES"); 可能会导致不同的密码,具体取决于默认的安全提供程序。它很可能会导致“TripleDES/ECB/PKCS5Padding”,但并非必须如此。如果它发生变化,您将失去不同 JVM 之间的兼容性。供引用:Java default Crypto/AES behavior

    此外,PKCS#5 填充和 PKCS#7 填充在所有意图和目的上都是相同的。

  • 您的 key 可能不同。 SHA-1 哈希值的输出为 20 字节,但完整的 3DES key 的长度为 24 字节。 Arrays.copyOf(digestOfPassword, 24); 用 0x00 字节值填充剩余的 4 个字节。在 CryptoJS 中,您直接将短 key 传递到 encrypt 函数中。您需要用 0x00 字节填充剩余字节。由于 CryptoJS 处理 WordArray 中的二进制数据,因此可以通过以下方式完成:

    key = CryptoJS.SHA1(key);
    key.sigBytes += 4; // 32 bit more marked
    key.words.push(0); // 32 bit of zeros
  • 你的 IV 很奇怪。原来如此简单:

    var ivHex = CryptoJS.enc.Hex.parse('0000000000000000'); // 8 bytes

    这可以用于测试,但在生产中 IV 必须是不可预测的(读取:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前何时发送过相同的消息前缀。 IV 不是 secret 的,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文之前并在解密之前将其切掉。

我建议您丢弃此代码(仅提供 80 位安全性并使用不良默认值)并使用 RNCryptor 等库。

<小时/>

安全考虑

切勿使用ECB mode 。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,例如 CBCCTR 。最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以通过 GCM 或 EAX 等身份验证模式或使用 encrypt-then-MAC 来完成。方案。

现在不要使用 Triple DES。 即使您使用最大的 key 大小 192 位,它最多也只能提供 112 位的安全性。如果使用较短的 key 大小,则它仅提供 56 或 57 位的安全性。 AES 速度更快(处理器具有特殊的 AES-NI 指令集),而且使用最低 128 位 key 大小也更安全。 3DES 的最大密文大小也有实际限制。请参阅Security comparison of 3DES and AES .

关于javascript Triple des 加密值和 java Triple des 加密值不匹配为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com