DELPHI国密SM4加密解密-可与JAVA互通
--代码源自开源项目cnvcl,引用单元请从cnpack官网下载
--cnvcl的git项目上边已经可以跟java互通了,官网的代码没有更新,很多朋友可能没发现,百度搜sm4的加解密也发现跟java的对不上,我在这里贴一下,想要源代码的可以在git搜cnvcl的项目
uses
CnSM4,CnBase64
//PKCS7填充
{* 给字符串末尾加上 PKCS7 规定的填充“几个几”的填充数据}
function StrAddPKCS7Padding(const Str: AnsiString; BlockSize: Byte): AnsiString;
var
R: Byte;
begin
R := Length(Str) mod BlockSize;
R := BlockSize - R;
if R = 0 then
R := R + BlockSize;
Result := Str + AnsiString(StringOfChar(Chr(R), R));
end;
{* 去除 PKCS7 规定的字符串末尾填充“几个几”的填充数据}
function StrRemovePKCS7Padding(const Str: AnsiString): AnsiString;
var
L: Integer;
V: Byte;
begin
Result := Str;
if Result = '' then
Exit;
L := Length(Result);
V := Ord(Result[L]); // 末是几表示加了几
if V <= L then
Delete(Result, L - V + 1, V);
end;
//加密
function Sm4Encode(Value,key:Ansistring):AnsiString;
var
Output: AnsiString;
Len: Integer;
s: string;
BaseByte:Byte;
begin
Result := '';
BaseByte := 200;
try
if Value = '' then Exit;
Len := Length(UTF8Encode(Value));
if Len < 16 then
Len := 16
else
Len := (((Len - 1) div 16) + 1) * 16;
SetLength(Output, Len);
ZeroMemory(@(Output[1]), Len);
SM4EncryptEcbStr(UTF8Encode(key), StrAddPKCS7Padding(UTF8Encode(Value),SM4_BLOCKSIZE), @(Output[1]));
BaseByte := Base64Encode(Output,s);
if BaseByte <> 0 then Exit;
Result := s;
finally
if Result = '' then
raise Exception.Create('SM4Encode Error!Base64:'+inttostr(BaseByte));
end;
end;
//解密
function Sm4Decode(Value,key:Ansistring):AnsiString;
var
S: AnsiString;
Output: AnsiString;
Len: Integer;
BaseByte :Byte;
begin
Result := '';
BaseByte := 200;
try
if Value = '' then Exit;
BaseByte := Base64Decode(AnsiString(Value),s);
if BaseByte <> 0 then Exit;
Len := Length(S);
if Len < 16 then
Len := 16
else
Len := (((Len - 1) div 16) + 1) * 16;
SetLength(Output, Len);
ZeroMemory(@(Output[1]), Len);
SM4DecryptEcbStr(UTF8Encode(key), S, @(Output[1]));
Output := StrRemovePKCS7Padding(Output);
Result := UTF8Decode(Output);
finally
if Result = '' then
raise Exception.Create('SM4Decode Error!Base64:'+inttostr(BaseByte));
end;
end;

浙公网安备 33010602011771号