DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ahttp123
今日帖子: 22
在线用户: 10
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/14 17:14:43
标题:
那位大神有DelphiXE与C#能相通的DES或其他加解密方法? 浏览:2934
加入我的收藏
楼主: 那位大神有DelphiXE与C#能相通的DES或其他加解密方法?

还望分享下


感谢!

----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/14 18:42:29
1楼: CBC ECB ?
还有补码方式?
iv 是多少?

这些都不说,无法帮你。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 qnaqbgss (Fly) ★☆☆☆☆ -
盒子活跃会员
2017/11/14 21:31:28
2楼: delphi写com,C#调用就好了,我就是这样做的。
----------------------------------------------
Delphi,C#,Android企业管理、即时通信、系统优化、方案设计
作者:
男 drroc (mvcxe) ★☆☆☆☆ -
盒子活跃会员
2017/11/14 23:05:56
3楼: xxtea速度快,一般用强度也够
https://github.com/xxtea
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:https://www.mvcxe.com/
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2017/11/15 8:37:04
4楼: delphi DES

uses
  EncdDecd;
    function EncryptDES(const aStr: string): string;
    function DecryptDES(const aEncry: string): string;
var
    Key, iv: TKey64;
    
{ TEncry }
procedure IniDES;
var
  temp: string;
  I: integer;
begin
  temp := '1234567890pass';
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      key[i] := 0
    else
      key[i] := byte(temp[i+1]);
  end;
  temp := 'worderd';
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      iv[i]:=0
    else
      iv[i] := byte(temp[i+1]);
  end;
end;


function TEncry.DecryptDES(const aEncry: string): string;
var
  Context : TDESContext;
  Encrypt: boolean;
  temp, res: string;
  posnum, i, J: integer;
  bak, Block: TDESBlock;
begin
  IniDES();
  Encrypt := false;
  InitEncryptDES(Key, Context, Encrypt);
   //for i:=0 to 7 do block[0] := 0;
  temp := DecodeString( aEncry )     ;
  posnum := 0;
  for i:=0 to length(temp)-1 do begin
    Block[posnum] := byte(temp[i+1]);
    posnum := posnum+1;
    if posnum = 8 then begin
       bak := block;
       EncryptDESCBC(Context, TDESBlock(IV), Block);
       for j:= 0 to 7 do begin
         //  temp := temp+inttostr(byte(block[i]))+' ';
          res := res +   char(block[j]);
       end;
       iv := TKey64(bak);
      posnum := 0;
    end;
  end;
  if posnum <> 0 then begin
     raise Exception.Create('解密出错');
  end else begin
   temp:='';
   //len := res[length(res)] ;
    for i:= 1 to length(res) do begin
      temp := temp+char(res[i]);
    end;
    Result := trim(temp);
   end;
end;

function TEncry.EncryptDES(const aStr: string): string;
var
  Context : TDESContext;
  Encrypt: boolean;
  temp, res: string;
  len, posnum, i, J: integer;
  poschar: Char;
  Block: TDESBlock;
begin
  IniDES();
  Encrypt := True;
   InitEncryptDES(Key, Context, Encrypt);
    temp := aStr;
    len := length(temp);

    temp := temp+ char( 8- (len mod 8));

    posnum := 0;
    for i:=0 to len do begin
      poschar:= temp[i+1];
      Block[posnum] := byte(poschar);
      posnum := posnum +1;
      if posnum = 8 then begin
         EncryptDESCBC(Context, TDESBlock(IV), Block);
         for j:= 0 to 7 do begin
          res := res +   char(block[j]);
         end;
         iv := TKey64(block);
         posnum := 0;
      end;

    end;
    if  posnum <> 0 then begin
      for i:=posnum to 7 do begin
         Block[i] := byte(poschar);
      end;
      EncryptDESCBC(Context, TDESBlock(IV), Block);
         for j:= 0 to 7 do begin
          res := res +   char(block[j]);
         end;
         posnum := 0;
    end;          // IdEncoderMIME1
    Result := EncodeString(res);
end;


C#实现

byte[] keyDES = new byte[8];
        byte[] iv = new byte[8];

        #region DESDelphi通用

        private void iniDES()
        {
          byte[] temp = Encoding.ASCII.GetBytes("1234567890pass");
          byte[] temp1 = Encoding.ASCII.GetBytes("worderd");
          for (int i = 0; i < 8; i++)
          {
          if (i < temp.Length)
          {
          keyDES[i] = temp[i];
          }
          else
          {
          keyDES[i] = 0;
          }
          if (i < temp1.Length)
          {
          iv[i] = temp1[i];
          }
          else
          {
          iv[i] = 0;
          }
          }
        }

        private string DESEncryptString(string Value)
        {
          DESCryptoServiceProvider des = new DESCryptoServiceProvider();
          ICryptoTransform ct;
          MemoryStream ms;
          CryptoStream cs;
          byte[] byt;
          des.Key = keyDES;
          des.IV = iv;
          ct = des.CreateEncryptor();
          byt = Encoding.UTF8.GetBytes(Value);


          ms = new MemoryStream();
          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
          cs.Write(byt, 0, byt.Length);
          cs.FlushFinalBlock();

          cs.Close();
          byte[] bytesCipher = ms.ToArray();
          return Convert.ToBase64String(bytesCipher);
        }

        private string DESDecryptString(string Value)
        {
          DESCryptoServiceProvider des = new DESCryptoServiceProvider();

          ICryptoTransform ct;
          MemoryStream ms;
          CryptoStream cs;
          byte[] byt;

          des.Key = keyDES;
          des.IV = iv;
          ct = des.CreateDecryptor();

          byt = Convert.FromBase64String(Value);

          ms = new MemoryStream();
          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
          cs.Write(byt, 0, byt.Length);
          cs.FlushFinalBlock();

          cs.Close();
          byte[] bytesCipher = ms.ToArray();
          return Encoding.UTF8.GetString(bytesCipher, 0, bytesCipher.Length);
        }
        #endregion
----------------------------------------------
Delphi爱好者。
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/15 15:24:21
5楼: 非常感谢,但是写进去还是不通啊
delphi加密:DES('ABC123')=Gy7CtDpgw4DDm3Y=
C# DES("ABC123")=Gy60OmDA23Y=
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/15 15:28:32
6楼: ....
delphi7没问题加密是:Gy60OmDA23Y=  
delphiXE 10.2加密是:Gy7CtDpgw4DDm3Y=
----------------------------------------------
-
作者:
男 djhfwk (djhfwk) ▲▲▲▲▲ -
普通会员
2017/11/15 15:38:02
7楼: 要一样用ansistring
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/15 15:51:19
8楼: unit BWDAndNetDesUtil;

interface

uses
  SysUtils, EncdDecd, LbCipher;

type
  TEncry = class
  public
    class procedure IniDES(aKey: AnsiString);
    class function EncryptDES(const aSrc, aKey: AnsiString): AnsiString;
    class function DecryptDES(const aEncry, aKey: AnsiString): AnsiString;
  end;

var
  Key, iv: TKey64;

implementation

{ TEncry }

class procedure TEncry.IniDES(aKey: AnsiString);
var
  temp: AnsiString;
  I: integer;
begin
  temp := '1234567890pass'; //aKey;//
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      key[i] := 0
    else
      key[i] := byte(temp[i+1]);
  end;
  temp := 'worderd';
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      iv[i]:=0
    else
      iv[i] := byte(temp[i+1]);
  end;
end;

class function TEncry.EncryptDES(const aSrc, aKey: AnsiString): AnsiString;
var
  Context : TDESContext;
  Encrypt: boolean;
  temp, res: AnsiString;
  len, posnum, i, J: integer;
  poschar: AnsiChar;
  Block: TDESBlock;
begin
  IniDES(aKey);
  Encrypt := True;
   InitEncryptDES(Key, Context, Encrypt);
    temp := aSrc;
    len := length(temp);

    temp := temp+ char( 8- (len mod 8));

    posnum := 0;
    for i:=0 to len do begin
      poschar:= temp[i+1];
      Block[posnum] := byte(poschar);
      posnum := posnum +1;
      if posnum = 8 then begin
         EncryptDESCBC(Context, TDESBlock(IV), Block);
         for j:= 0 to 7 do begin
          res := res +   char(block[j]);
         end;
         iv := TKey64(block);
         posnum := 0;
      end;

    end;
    if  posnum <> 0 then begin
      for i:=posnum to 7 do begin
         Block[i] := byte(poschar);
      end;
      EncryptDESCBC(Context, TDESBlock(IV), Block);
         for j:= 0 to 7 do begin
          res := res +   char(block[j]);
         end;
         posnum := 0;
    end;          // IdEncoderMIME1
    Result := EncodeString(res);
end;

class function TEncry.DecryptDES(const aEncry, aKey: AnsiString): AnsiString;
var
  Context : TDESContext;
  Encrypt: boolean;
  temp, res: string;
  posnum, i, J: integer;
  bak, Block: TDESBlock;
begin
  IniDES(aKey);
  Encrypt := false;
  InitEncryptDES(Key, Context, Encrypt);
   //for i:=0 to 7 do block[0] := 0;
  temp := DecodeString( aEncry )     ;
  posnum := 0;
  for i:=0 to length(temp)-1 do begin
    Block[posnum] := byte(temp[i+1]);
    posnum := posnum+1;
    if posnum = 8 then begin
       bak := block;
       EncryptDESCBC(Context, TDESBlock(IV), Block);
       for j:= 0 to 7 do begin
         //  temp := temp+inttostr(byte(block[i]))+' ';
          res := res +   char(block[j]);
       end;
       iv := TKey64(bak);
      posnum := 0;
    end;
  end;
  if posnum <> 0 then begin
     raise Exception.Create('解密出错');
  end else begin
   temp:='';
   //len := res[length(res)] ;
    for i:= 1 to length(res) do begin
      temp := temp+char(res[i]);
    end;
    Result := trim(temp);
   end;
end;

end.

上述代码:
delphiXE10.2加密ABC123结果: Gy7igLI6YMOgP3Y=
delphi7 加密ABC123结果:Gy60OmDA23Y=
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/15 15:54:26
9楼: 不知道是不是是缺少LbCipher.pas这个单元的问题
我在网上找的
----------------------------------------------
-
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2017/11/15 17:30:58
10楼: 楼上测试的结果没错。我的代码是在D7下通过的,没有测试XE以上系统。
----------------------------------------------
Delphi爱好者。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/15 18:21:37
11楼: 这就是为啥人家 加密解密都用 TBytes 而你们都用 string 。
人家 其他语言 要么 PAnsiChar 要么 PByte 要么 array of Byte 要么 array of AnsiChar
哪个用你 string 了?

现如今 DELPHI 也支持 TBytes 了,还抱着 string 不放?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/15 18:27:02
12楼: 楼主依然没说 ECB CBC?
iv 和 key 又是啥?
此帖子包含附件:
PNG 图像
大小:14.8K
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/15 18:50:19
13楼: 这个结果对吗?
此帖子包含附件:
PNG 图像
大小:14.7K
----------------------------------------------
(C)(P)Flying Wang
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2017/11/15 19:37:52
14楼: CBC模式,Key=1234567890pass,iv=worderd
delphi7和C#加密ABC123结果:Gy60OmDA23Y=   
隔壁老王对了,wang望分享下:)
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/15 19:42:31
15楼: https://sourceforge.net/projects/flyutilsencrypt/
去下载吧。
问题是 算法写得比较渣。
建议用 lockbox 代替。
https://github.com/TurboPack/LockBox3
https://github.com/TurboPack/LockBox
----------------------------------------------
(C)(P)Flying Wang
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2017/11/15 21:50:38
16楼: 还有比 moRMot更好的推荐吗?

https://synopse.info/fossil/dir?ci=tip

大牛, 性能,可靠性不用说,关键是注释,文档还详细.
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2017/11/16 10:10:36
17楼: 直接调用openssl不好么
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 neptune_hsu (海神尼普頓) ▲▲▲▲▲ -
普通会员
2017/11/16 12:06:20
18楼: 15 樓 wang_80919 (Flying Wang) 寫的 AES 確定可跟 c# 加密過的字串一樣

重點只在一個地方,c# 使用時一般習慣直接用預設的 padding 模式,不會特別寫在程式碼中,只要用 TPaddingMode::pmPKCS5or7Padding 就可得到相同結果。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/16 12:56:41
19楼: 預設的 padding 模式 是哪种?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ghs_79 (ghs) ★☆☆☆☆ -
盒子活跃会员
2017/11/16 14:40:54
20楼: wang_80919 (Flying Wang)  13楼的结果是一致的。
----------------------------------------------
Delphi爱好者。
作者:
男 neptune_hsu (海神尼普頓) ▲▲▲▲▲ -
普通会员
2017/11/17 14:10:37
21楼: @wang_80919 (Flying Wang) 

誤會,是我表達不清楚,18 樓的回應主要跟原 PO 說你的 AES 函式我測試過,結果跟 C# 是一致的。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/17 14:17:15
22楼: 我的 AES 支持 补0 和 按块大小补(pmPKCS5or7Padding) 还有 pmISO10126,这3 种。
这 3 种 听说基本上很多语言都支持。
您说的  C# 默认和以上 三种是不是都不一样?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 neptune_hsu (海神尼普頓) ▲▲▲▲▲ -
普通会员
2017/11/17 15:14:38
23楼: C# 不特別指定padding 時,預設採用 PKCS7 ,所以,用您的 AES 時,選擇 pmPKCS5or7Padding 就會相同
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/17 16:02:20
24楼: 哦,明白了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2018/4/12 15:36:56
25楼: function DESDecrypt(aCipherText, aKey: String): string; //DES解密
var
  APaddingMode: TPaddingMode;
  CipherMode: TCipherMode;
begin
  CipherMode := TCipherMode.CBC;
  APaddingMode := TPaddingMode.pmPKCS5or7RandomPadding;
  Result := DESDecryptStrFromBase64(aCipherText.Trim, aKey, TEncoding.UTF8, TEncoding.UTF8,
        aKey, APaddingMode, CipherMode, 16,
        rlCRLF, rlCRLF, nil);
end;


FlyUtils.CSharpJavaDES单元,DESStream_BytesKey过程中,这里好像不能用随机数补位:
        FillChar(StrBytes[BufLen], C_BlockSize - BufLen, PaddingCount);
        if (APaddingMode = TPaddingMode.pmPKCS5or7RandomPadding) and
          ((C_BlockSize - BufLen) > 3) then
        begin
          //使用随机数C#不能解密 - 注释此处代码 by Liwm 2018-04-12
          //StrBytes[BufLen + 1 + Random(C_BlockSize - BufLen - 2)] := Random(255);
        end;


另外TBase64Encoding做base64编码时会自动加换行符,可以参考“小鱼儿”修改:
function DecodeBase64Bytes(const InputString: string): Tbytes;
var
  mCoder: TBase64Encoding;
begin
  mCoder:= TBase64Encoding.Create(MaxInt);//这个参数是(隔N位加换行)-.-!
  try
    Result := mCoder.DecodeStringToBytes(InputString);
  finally
   FreeAndNil(mCoder);
  end;
  //Result := TNetEncoding.Base64.DecodeStringToBytes(InputString);//会默认加换行
end;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/4/12 16:25:37
26楼: pmPKCS5or7RandomPadding 这都不认识啊
注释屁的代码。
你不用不就行了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2018/4/12 17:26:38
27楼: 老代码操作 string  (byte)字节类型来处理的
xe string  双(byte)字节..显然..传达得解决 下 不能用老方法.

http://blog.qdac.cc/?p=4551  建议看看这个...
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行82.03125毫秒 RSS