DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hxh57738897
今日帖子: 30
在线用户: 16
导航: 论坛 -> 发布代码 斑竹:liumazi,ruralboy  
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/3/9 16:25:17
标题:
一个功能齐全的DES(含3DES)类 浏览:2889
加入我的收藏
楼主:  说明:

       DES要求密码长度为8Bytes,初始向量为8Bytes;

      3DES要求密码长度为3*8=24Bytes,初始向量为8Bytes;



      在此程序中,如果密码和初始向量的长度不足则以0补够,超出所需长度的则忽略。

      ECB模式下,不需要提供初始向量



      Uses列表中System.NetEncoding这个单元要较新的Delphi版本才有。

      如果Delphi版本较低,但没有用到base64,可以把此单元、以及涉及此单元的过程和函数移除掉。

      如果一定要用,可以用indy的TIdEncoderMIME和TIdDecoderMIME来代替,具体用法可在网上搜索。

      另外本次修改把base64字符串改为默认不带换行符(#13#10)。源代码也有带换行符的设定,只是被注释掉了,如以下所示:

      //Base64Encoding := TBase64Encoding.Create; //含换行符
此帖子包含附件:bluestorm8_202139162517.rar 大小:60.6K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2021/3/9 16:30:25
1楼: https://sourceforge.net/projects/flyutilsencrypt
----------------------------------------------
(C)(P)Flying Wang
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2023/3/12 15:43:48
3楼: 上面2个DES加密结果不一样
----------------------------------------------
vvvvvvvvvv
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2023/3/12 17:20:38
4楼: 用cnPack的cnDES和u3DES,哪位大神有空看下加密方式哪里不一致了
此帖子包含附件:fb4819_2023312172038.zip 大小:109.2K
----------------------------------------------
vvvvvvvvvv
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/12 18:06:33
5楼: 不同端/平台/语言/实现的对称分组加密,要考虑的因素有很多: 

1、每块的加密算法(DES/AES/SM4等)
2、数据分块的每块大小(128/192/256等) 
3、块与块之间的运算模式(ECB/CBC/OFB/CFB等) 
4、数据不满足整数块时如何填充(PKCS1/PKCS7等)
5、密文是否要转变成可读的(Hex/Base64等) 
6、明文如果是字符串,加密时还有字符编码问题(UTF8/UTF16/Ansi等)

这六点基本上涵盖了对称加密的所有实战内容,如果碰到加解密对不上号的问题,可以先从这六个方面挨个研究。但凡有一处和所需的不一样,加密出来的结果就对不上号。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 powerpcer (大强) ★☆☆☆☆ -
禁用账号
2023/3/12 20:05:12
6楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
呆湾傻冒
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/3/12 23:01:27
7楼: 5楼说的全面。

特别是第6点字符编码,如果是调用OpenSSL的库,最好用RawByteString来传参,不然总不对。

比如简单的HMAC(),如果不用RawByteString传参,OpenSSL的计算和System.Hash.HMAC()的计算不一样。
----------------------------------------------
-
作者:
男 biznow (biznow) ★☆☆☆☆ -
盒子活跃会员
2023/3/13 11:55:29
8楼: 回1楼,Flying Wang,   https://sourceforge.net/projects/flyutilsencrypt,FlyUtils.Blowfish.pas在11.1及之后编译器中,debug会出问题报错,release正常,求修复!
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2023/3/14 14:16:46
9楼: @fb4819(4楼): 两个加密方式不一样,
  CnDES的加密方式是ECB(不需要初始向量)  , 填充模式是None(位数不足填0)
  u3DES的加密方式是CBC,初始向量是keystr, 填充模式是PKCS5
结果当然不一致,

如果你把u3DES里面的function EncryDes里面的两行:
  des.CipherMode :=TCipherMode.cmCBC;
  des.PaddingMode:=TPaddingMode.pmPKCS5;
改为
  des.CipherMode :=TCipherMode.cmECB;
  des.PaddingMode:=TPaddingMode.pmNone;
那么两种加密方式的结果就一样了.
此帖子包含附件:
PNG 图像
大小:5.5K
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/14 22:17:17
10楼: 准确来讲CnDES支持ECB和CBC两种块运算模式,视调用的函数而定。

块对齐方面,CnDES内部在内容没有块对齐时是通过在后面补#0凑足整块(也就是通常说的ZeroPadding)的。

不过CnPemUtils单元里有PKCS5/PKCS7的对齐处理函数,可以在此处理好对齐后调用CnDES进行加解密。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2023/3/14 22:47:14
10楼: 茅车顿开,感谢bluestorm8提供思路

反过来,cnDes也改几个地方结果也就一致了

1.修改MakeInputAlign,加个填充值参数
procedure MakeInputAlign(var Str: AnsiString;padding:Byte=0);
begin
  while Length(Str) mod DES_KEYSIZE <> 0 do
    Str := Str + Chr(padding);
end;
2.修改函数DESEncryptCBCStr,
MakeInputAlign(Str) -> MakeInputAlign(Str,8- (Length(Str) mod 8));
3.增加函数DESCBCEncryptStrToHex,调用它结果就一样了,如有中文Utf8Encode
function DESCBCEncryptStrToHex(const Str, Key: AnsiString): AnsiString;
var
  s,TempResult, Temp: AnsiString;
  I: Integer;
begin
  SetResultLengthUsingInput(Str, TempResult);
  DESEncryptCBCStr(Key, PAnsiChar(Key),Str, @TempResult[1]);

  Result := '';
  for I := 0 to Length(TempResult) - 1 do
  begin
    Temp := AnsiString(Format('%x', [Ord(TempResult[I + 1])]));
    if Length(Temp) = 1 then
      Temp := '0' + Temp;
    Result := Result + Temp;
  end;
end;
----------------------------------------------
vvvvvvvvvv
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/14 22:59:58
11楼: 感谢楼上指出,我们将添加DESCBCEncryptStrToHex和DESDecryptCBCStrFromHex两个函数进CnDES。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2023/3/14 23:14:28
12楼: 上面写法对中文还有点问题,如果明文是: 中国abc,好象结果就不正确了,热烈期待cnPack完善的版本
----------------------------------------------
vvvvvvvvvv
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2023/3/14 23:16:35
13楼: 中文问题估计对应到五楼说的第六点,要确定具体是什么字符编码。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS