AES encode in Delphi XE4 decode in Javascript



我想用Delphi XE4进行AES编码,用JavaScript解码。

我的德尔福密码:(我使用 DCPcrypt 加密组件库 v2 Beta 3)

procedure TForm1.Button5Click(Sender: TObject);
var
  Cipher : TDCP_rijndael;
  key: Ansistring;
  data: Ansistring;
  iv: Ansistring; 
begin
  Key := SHA256('password');
  IV :=   'cd6f6eea9a2a59f2';
  Data := '12345678901234567890';
Cipher := TDCP_rijndael.Create(Self);
if Length(Key) <= 16 then
  Cipher.Init(Key[1], 128, @IV[1])
else
  if Length(Key) <= 24 then
    Cipher.Init(Key[1], 192, @IV[1])
  else
    Cipher.Init(Key[1], 256, @IV[1]);
Cipher.EncryptCBC(Data[1],Data[1],Length(Data));
memo1.Lines.Add('DATA_ENC:'+DATA);
memo1.Lines.Add('DATA_BASE64_ENC: '+Base64encode(DATA));

结束;

我的JavaScript代码(我使用CryptoJS):

encypted = 'Pz8/yw0/ck+4tTY/Pn8zPz/f9D8=';  //input base64 text from Delphi routine
var key = CryptoJS.SHA256(CryptoJS.enc.Base64.parse("password"));
var iv  =     CryptoJS.enc.Base64.parse('cd6f6eea9a2a59f2');
var decrypted = CryptoJS.AES.decrypt(encrypted,key,
  keySize: 256,
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.ZeroPadding
  });
console.log('DECRYPTED: '+decrypted.toString(CryptoJS.enc.Utf8));

我没有拿回原文,请帮助我。这是怎么回事?

我对 Delphi 一无所知,所以我不能在那里帮助你,但我可以说,你的 Delphi 代码是错误的,因为如果你解析 Base64 密文并将其编码为 Hex,你会看到这样:

3f3f3fcb0d3f724fb8b5363f3e7f333f3fdff43f

现代密码的密文应该与随机噪声无法区分,但此密文看起来相当规则(有很多0x3f字节)。


你的JavaScript代码到处都是。几乎您使用的每个字符串都有错误的编码。

run.onclick = function(){
  var encrypted = CryptoJS.enc.Base64.parse(inVal.value);
  var key = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse("password"));
  var iv  = CryptoJS.enc.Utf8.parse('cd6f6eea9a2a59f2');
  var decrypted = CryptoJS.AES.decrypt({
    ciphertext: encrypted
  }, key, {
    iv: iv,
    padding: CryptoJS.pad.ZeroPadding
  });
  outHex.innerHTML = decrypted.toString();
  outUtf8.innerHTML = decrypted.toString(CryptoJS.enc.Utf8);
};
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/sha256.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/pad-zeropadding-min.js"></script>
<div>Base64 input: <input id="inVal" value="Pz8/yw0/ck+4tTY/Pn8zPz/f9D8="></div>
<div>Decrypted Hex: <span id="outHex">-</span></div>
<div>Decrypted Utf8: <span id="outUtf8">-</span></div>
<div><button id="run">Decrypt</button></div>

修复 Delphi 代码后,您可以将 Base64 包含在上述可运行代码段中,并查看解密是否正确。


安全注意事项:

  • 如果要使用同一密钥发送多个密文,则需要使用随机 IV。如果再次发送相同的消息,攻击者只能通过观察密文来查看。IV不必是秘密的,因此您可以将其与密文一起发送。一种常见的方法是将其附加到密文前面,并在解密前将其删除。

  • SHA-256不足以从低熵密码派生密钥。您应该使用迭代密钥派生函数 (KDF),例如 PBKDF2、bcrypt、scrypt 或 Argon2。另请参阅: 如何安全地散列密码?

  • 最好对密文进行身份验证,以便不可能进行填充预言机攻击等攻击。这可以通过 GCM 或 EAX 等经过身份验证的模式或先加密 MAC 方案来完成。

相关内容

最新更新