查看: 89|回复: 0

DELPHI国密SM4加密解密-可与JAVA互通

[复制链接]

1

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-2-16
发表于 2022-6-7 15:25:00 | 显示全部楼层 |阅读模式

--代码源自开源项目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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部