使用indy实现DES/ECB加解密
最近在使用indy的,时候发现新的indy封装很多加解密的方法,苦于说明的资料太少,大家基本还是在用第三方写的函数库。结合前端时间实现RSA加密的方法,我写了个DES的例子,试了下,base64的编码返回和网上在线加解密的结果是一样的。
还有个问题是,目前只能实现字符串的加密,字节流和字节数组还不会搞…
function DES_Encrypt(key, StrIn: ansistring; bmfs: Integer;
var strOut: ansistring): Integer; // bmfs: 0 base64,1:hex 编码方式
var
md_ctx: EVP_CIPHER_CTX;
nCipher, nTmp, rv: Integer;
sCipher, sBase64: Array [0 .. 4095] of AnsiChar;
begin
Result := -1;
// 初始化密码算法结构体
EVP_CIPHER_CTX_init(@md_ctx);
// 设置算法和密钥
rv := EVP_EncryptInit_ex(@md_ctx, EVP_des_ecb(), Nil, PansiChar(key), nil);
if rv <> 1 then
begin
Result := -2;
exit;
end;
// 数据加密
rv := EVP_EncryptUpdate(@md_ctx, sCipher, @nCipher, PansiChar(StrIn),
length(StrIn));
if rv <> 1 then
begin
Result := -3;
exit;
end;
rv := EVP_EncryptFinal_ex(@md_ctx, sCipher + nCipher, @nTmp);
if rv <> 1 then
begin
Result := -4;
exit;
end;
nCipher := nCipher + nTmp;
case bmfs of
0:
strOut := EncodeBase64(@sCipher, nCipher);
1:
strOut := strtohex(sCipher);
end;
EVP_CIPHER_CTX_cleanup(@md_ctx);
Result := 0;
end;