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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本