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