【发布时间】:2020-07-01 18:31:36
【问题描述】:
我使用下面的方法加密了 NodeJs 中的一些数据。它可以在 Nodejs 服务器上正常加密和解密。
加密输入 = "SIYdcYSyiWY5XUqYMrfv31sPF8DSojs1ikghMs4R"
在的NodeJS加密的输出= “IRhqmwhlFUxS1Zg + Qyr2ykSkAA1cQ5gVts7RIZoULCbYMS / DVsdfTyanGAAu4HkuAZv4ynk + VBPZ6vaTH5xTONfuVRlUavF9X // 12v5et5em1ItPYdlOWkYo5IkodpAQvm5Yrm4F5xaRxRU3 + TAZzOQm / 3YQIlz74X + 3V3 / AV / K4qFebSLUMZJM9glPWo4O + ISDf76ztiN2ynLyvsivSU / qUuQEtPVEK” P>
encryptAES = ((text) => {
// random initialization vector
const iv = crypto.randomBytes(16);
const salt = crypto.randomBytes(64);
var masterKey = crypto.randomBytes(32);
const key = crypto.pbkdf2Sync(masterKey, salt, 2145, 32, 'sha512');
// AES 256 GCM Mode
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);
// extract the auth tag
const tag = cipher.getAuthTag();
// generate output
return Buffer.concat([salt, iv, tag, masterKey, encrypted]).toString('base64');
});
我尝试在 Java 客户端上解密它,但由于某种原因它失败了。我很确定我没有使用正确的解密方式。下面是我走了多远
public String decrypt(String base64EncryptedData) throws Exception {
byte[] decryptedData = Base64.getDecoder().decode(base64EncryptedData);
byte[] salt = Arrays.copyOfRange(decryptedData, 0, 64);
byte[] iv = Arrays.copyOfRange(decryptedData, 64, 80);
byte[] tag = Arrays.copyOfRange(decryptedData, 80, 96);
String masterKey = new String(Arrays.copyOfRange(decryptedData, 96, 128), "UTF-8");
byte[] text = Arrays.copyOfRange(decryptedData, 128, decryptedData.length); ;
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(tag.length * 8, iv);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
KeySpec spec = new PBEKeySpec(masterKey.toCharArray(), salt, 2145, 32*8);
SecretKey tmp = factory.generateSecret(spec);
key = new SecretKeySpec(tmp.getEncoded(), "AES");
dcipher = Cipher.getInstance("AES/GCM/NoPadding");
dcipher.init(Cipher.DECRYPT_MODE, key, gcmParameterSpec);
byte[] utf8 = dcipher.doFinal(text);
return new String(utf8, "UTF8");
}
在 Java 中我得到异常
javax.crypto.AEADBadTagException: Tag mismatch!
【问题讨论】:
-
客户给出的错误是什么? PBEKeySpec 中的 512 不正确。在多平台问题中,最好提供输入和输出。
-
@kelalaka 我用加密字符串更新了它
标签: java node.js encryption aes aes-gcm