|
--代码源自开源项目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;
来源:https://www.cnblogs.com/Yang-YaChao/p/16351961.html |