Tôi cố gắng để sử dụng Tháng Mười Hai 3.0 thư viện (Delphi Encryption Compedium Part I) để mã hóa dữ liệu trong Delphi 7 và gửi nó đến một kịch bản PHP qua POST, nơi tôi đang giải mã nó với Mcrypt (RIJNDAEL_256, chế độ ECB).Delphi Tháng Mười Hai thư viện (Rijndael) mã hóa
Delphi phần:
uses Windows, DECUtil, Cipher, Cipher1;
function EncryptMsgData(MsgData, Key: string): string;
var RCipher: TCipher_Rijndael;
begin
RCipher:= TCipher_Rijndael.Create(KeyStr, nil);
RCipher.Mode:= cmECB;
Result:= RCipher.CodeString(MsgData, paEncode, fmtMIME64);
RCipher.Free;
end;
PHP phần:
function decryptMsgContent($msgContent, $sKey) {
return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sKey, base64_decode($msgContent), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
}
Vấn đề là giải mã từ PHP không hoạt động và đầu ra là vô nghia, khác nhau từ các dữ liệu thực tế.
Tất nhiên, Delphi Key
và PHP $Key
có cùng chuỗi 24 ký tự.
Bây giờ tôi biết DEC 3.0 cũ và lỗi thời, và tôi không phải là chuyên gia về mã hóa và không thể biết liệu việc thực hiện có thực sự là Rijndael 256. Có thể ai đó có thể cho tôi biết cách thực hiện này khác với mcrypt của PHP RIJNDAEL_256. Có lẽ các keyize là khác nhau, hoặc kích thước khối, nhưng không thể nói điều này từ mã. Dưới đây là một đoạn trích từ Cipher1.pas:
const
{ don’t change this }
Rijndael_Blocks = 4;
Rijndael_Rounds = 14;
class procedure TCipher_Rijndael.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := Rijndael_Blocks * 4;
AKeySize := 32;
AUserSize := (Rijndael_Rounds + 1) * Rijndael_Blocks * SizeOf(Integer) * 2;
end;
Side câu hỏi:
tôi biết chế độ ECB không được khuyến khích và tôi sẽ sử dụng CBC ngay sau khi tôi được làm việc ECB. Câu hỏi đặt ra là, tôi có phải truyền IV đã tạo trong Delphi sang tập lệnh PHP không? Hoặc biết chìa khóa là đủ, như cho ECB?
Đây có thể là một câu hỏi rất ngu ngốc. Nhưng bằng cách sử dụng delphi là bạn có thể giải mã dữ liệu được mã hóa của bạn? Ồ, và câu trả lời cho câu hỏi này có hữu ích không: http://stackoverflow.com/q/8313992/41338 – RobS
Bạn gọi mcrypt_create_iv(). IV bạn đã sử dụng ở Delphi là gì? –
@ldsandon: tài khoản đang sử dụng chế độ ECB. Không có IV. –