导航:
论坛 -> 发布代码
斑竹:liumazi,ruralboy
作者:
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; //含换行符
----------------------------------------------
-
作者:
2021/3/9 16:30:25
1楼:
https://sourceforge.net/projects/flyutilsencrypt
----------------------------------------------
(C)(P)Flying Wang
作者:
2023/3/12 15:43:48
3楼:
上面2个DES加密结果不一样
----------------------------------------------
vvvvvvvvvv
作者:
2023/3/12 17:20:38
4楼:
用cnPack的cnDES和u3DES,哪位大神有空看下加密方式哪里不一致了
----------------------------------------------
vvvvvvvvvv
作者:
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/
作者:
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正常,求修复!
----------------------------------------------
-
作者:
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; 那么两种加密方式的结果就一样了.
此帖子包含附件: 大小: 5.5K
----------------------------------------------
-
作者:
2023/3/14 22:17:17
10楼:
准确来讲CnDES支持ECB和CBC两种块运算模式,视调用的函数而定。 块对齐方面,CnDES内部在内容没有块对齐时是通过在后面补#0凑足整块(也就是通常说的ZeroPadding)的。 不过CnPemUtils单元里有PKCS5/PKCS7的对齐处理函数,可以在此处理好对齐后调用CnDES进行加解密。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
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
作者:
2023/3/14 22:59:58
11楼:
感谢楼上指出,我们将添加DESCBCEncryptStrToHex和DESDecryptCBCStrFromHex两个函数进CnDES。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/
作者:
2023/3/14 23:14:28
12楼:
上面写法对中文还有点问题,如果明文是: 中国abc,好象结果就不正确了,热烈期待cnPack完善的版本
----------------------------------------------
vvvvvvvvvv
作者:
2023/3/14 23:16:35
13楼:
中文问题估计对应到五楼说的第六点,要确定具体是什么字符编码。
----------------------------------------------
欢迎使用CnPack IDE Wizards http://www.cnpack.org/