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;

posted @   Yang杨。  阅读(2324)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示