目录
1. 前言
2. 准备工作
3. Demo注意事项说明
3.1 公钥、私钥文本格式
3.2 回车键的影响
3.3 中文加解密说明
4. 结语
1. 前言
最近工作上安排了一个项目,与工商银行之间做转账,我看其中涉及到了RSA签名加解密,由于公司写接口都用用Delphi6,老古董了,这RSA算法不好搞。
之前我也自己喜欢收集一些加密算法封装在dll,发现没有RSA这块,看来要自己来搞了。
//MD5 加密 不支持逆向解密
function dll_md5_encrypt(iLen, iUpper: integer; sIn: PWideChar; var sOut: PWideChar): Byte; stdcall;
//BASE64 加密
function dll_base64_encrypt(sIn: PWideChar; var sOut: PWideChar): Byte; stdcall;
//BASE64 解密
function dll_base64_decrypt(sIn: PWideChar; var sOut: PWideChar): Byte; stdcall;
//ECB 加密
function dll_aes_ecb_encrypt(sIn, skey: PWideChar; var sOut: PWideChar): Byte; stdcall;
//ECB 解密
function dll_aes_ecb_decrypt(sIn, skey: PWideChar; var sOut: PWideChar): Byte; stdcall;
//CBC 加密
function dll_aes_cbc_encrypt(sIn, skey, siv: PWideChar; var sOut: PWideChar): Byte; stdcall;
//CBC 解密
function dll_aes_cbc_decrypt(sIn, skey, siv: PWideChar; var sOut: PWideChar): Byte; stdcall;
2. 准备工作
2.1 app应用公私钥一份。
2.2 开发工具
Delphi XE 10.1 Berlin 这个是我家里电脑一直安装有这个。公司没用。
2.3. 下载源码
这是大佬的源码 感谢分享 https://github.com/ZYHPRO/RSAEncryptAndDecode
# RSA via OpenSSL libeay32
delphi2010以后版本,使用openssl中的libeay32.dll
提供基于私钥/公钥的:
1、RSA加密解密
2、SHA1/SHA256/SHA512摘要运算,
3、Sha1withRSA/Sha256withRSA/Sha512withRSA签名, 其中签名可用于JWT规范
我用的XE10.1版本高了,后续处理了下代码,与大家借鉴下。
3. Demo注意事项说明
3.1 公钥、私钥文本格式
在RSAOpenSSL.pas单元中,TRSAOpenSSL.LoadPrivateKeyFromString方法指定了公钥、私钥的文本内容格式。
如果公钥、密钥文件用记事本打开不是这样样子,就打开在线解析地址
RSA在线加密/在线解密 公钥加密,公钥解密,私钥加密,私钥解密 - The X 在线工具
选择RSA, 将密钥拷贝进去,然后点击其他空白地方,会自动生成内容抬头和内容结尾。然后再拷贝到密钥文件里保存就可以了。
3.2 回车键的影响
Unit1.pas单元117行
Memo的内容出现回车键,需要替换掉,不然影响加密结果(谁知道那里有个回车键...)。
aRSAData.DecryptedData := mmo_pp.Text;
修改为
aRSAData.DecryptedData := StringReplace(mmo_pp.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
3.3 中文加解密说明
由于我用的是XE10.1,版本高。再Demo的memo里,文本内容出现汉字的话,编码格式是GBK,所以,在线解析和用Demo解析才会一致
这又牵扯到另外一点了,像现在服务一般是Java或C#来写的,一般都是采用UTF8格式。所以修改Unit1.pas单元117行,将
aRSAData.DecryptedData := StringReplace(mmo_pp.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
修改为
aRSAData.DecryptedData := UTF8Encode(StringReplace(mmo_pp.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]));
4. 结语
再次感谢大佬的分享,https://github.com/ZYHPRO/RSAEncryptAndDecode