Delphi / 算法 · 2024年6月19日

RSA2(SHA256withRSA)算法的Delphi实现

网上对于该算法的Delphi实现代码也蛮多,不是用不了就是需要money的;但是终究还是找到了一个可以用的;虽然界面很粗糙,但是确实可以使用,运算结果也是正确的;不过呢这个程序是需要读取pem格式文件,且这个文件需要2048位的PKCS8编码格式(也就是常说的JAVA格式),这点要特别注意,当时就是这个地方卡了好久~~特别特别注意

简单用代码介绍一下调用方法;调用方法仍然是老三样:创建->调用->释放

//引用单元
uses  RsaOpenSSL;

//创建RSA2对象
//pem文件需要需要2048位的PKCS8编码格式(也就是常说的JAVA格式)
//如果给出的的时字符串,需要手工将其转换为pem格式;
aPathToPublickKey := 'public.pem';         //公钥文件;实际项目使用时请使用绝对路径
aPathToPrivateKey := 'private.pem';        //私钥文件;实际项目使用时请使用绝对路径
fRSAOpenSSL := TRSAOpenSSL.Create(aPathToPublickKey, aPathToPrivateKey);

//调用生成RSA2签名;特别注意一下SHA256_Sign_PK函数的输入字符串的编码;很多人这个地方会卡住
//因为像Delphi7/2007等采用的是GBK  DelphiXE等采用的是unicode;都需要使用utf8encode进行转码
//另外为了防止传输过程中中文乱码的问题,在实际项目中可是使用转码后进行Base64编码
_Sign :=  fRSAOpenSSL.SHA256_Sign_PK(utf8encode(_Str));


//释放
FreeAndNil(fRSAOpenSSL);
JavaScript

生成密钥和验证签名,我都使用的支付宝开放平台密钥工具;使用很简单,展示一下签名数据 一致;

上面也说到了密钥的pem格式;如果需要进行手工转换的话,处理方式为将密钥字符串固定截取64个字符为一行,后部增加换行符,并将其保存为pem格式(可以参照提供的样例格式,样例中的 ——-BEGIN PUBLIC KEY——- 等不可省略,这个是格式的一部分)

私秘钥样例

-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCC9BOCWlzOoqfz
/cDSH5Wyhak7FnAJbx+ZvDu/5QXS/rCM4OrkNGbJaNbiGTv/79ivmlQiM4plfxed
W3znh+atEebm8QpFtKGg+nTOGMaeSt+spOzhp76q0Y50o6heu7TUaKU9kJT8zHEk
6dYi/tASnrgTVkGjjurFr4wHiIxMgZoTGTMjbgWqu+793D5e3kW/84ubDoM+igQq
ik6vzjzWxn5TMFsqO4Ri3zKa9OhS8dXkysqgo0Sy7sU37BOY7mqs8meuqp357NLz
FKyX+If+6nsJyix025yIRuxBv5joid5NyV4qqElczn+u3j/GVI+Ez50tYatbf3KF
Zk3b7dwbAgMBAAECggEATHvLrTWjwNhFaf8KEG98GjFwvt8C/q+VcE/9Qb28ohg4
+38eEbz9T6NY5eNBJOFr2Fw1yWf66/7HxxM5J207cFflWXrsufue7wt5DypvTuKC
My58X+t+M/yCzGMNoo7VNb4MzKFWMzQg3SNp+zSCSG3FKx4U5jdBrcYy7e91qfSq
dWP8hGnxJRvNDsj1UgaCQQhMZxA2ki1KXV9CTuWweciiFanpeo546GyEC2WqI/qT
erO1z6uFC8FamFamOQ/8CkahoIyINRSmjRO+c8H02PBoIkif1N69TVbRVNvovN6l
89onoFo+/h+k8y8AzI+mqc2wZfDawmt/EvTNzxYzaQKBgQDcjlo4HeRNspPbr3lv
48qwVwqcLMAl9b56vsLIlwtnZqUMuP73qw5lvX4LZai0Gu8kuiQ2iQEevlGJpu1M
mlW5Sc/LuptsKCyzfk20NIM2YHmDLQH3rVSiEJpzNLuTT3aXjm91I8HgQCUnq+mW
ZhDRTjaEH/4JRkKV19v3nFIfRwKBgQCX/3ucrvbZ5BltaTEUdVbZvr2750ayEsa7
K1Xhxqh5NnjN8VolGbff2HXWFsS7roZ9vXJBDqEGzPHH+mr+WNnQbMgX3nuF8dj6
cHz59PR2SKGjDz0WIZr2FF5ATEG1dL/sg93bO5OHjAb9bCqWenjkSs6dVqfQQyt5
87S4jP1OjQKBgDhE2R+YALcR6EcT7ZduNjfm/P37LMqCd6Y5JNioMHCg71rfl6z4
JyQtxAqEVRYeCQUFuFdxfKerRoIn5EK23Uf4XNtNMHnXhhAFGS3wd8lXs6iTwvy9
a+os8jqSKYjbrRXdcPIhvUTJGLGWWnHUeFXt7lqnDtiu5C32dFgnuYvhAoGAa9IO
RJoUf4H/y434A9QstK9KdfVcP8tz76eQ92Rtc/aBAU24rWKt/XrWM/TYv23Q93cg
iievcFyHEl1/8kbi06em1M+8fcqOKTEMZl8t3o4tIrcXlRBnlTHjnea6IdbcohD0
mqSLRXa+KpzFJRNhmEe8gv3KcsCDIbIPu24/7a0CgYBDt9h+2wpis2V73M98BjMv
Zi1P+GGTz+INh6lCFz2e+SC/tf6+fgM7yE2MhGwAxrppydnoTSsm5ZX5rmhuh//Q
8DB608oIIQRiFQlltD9pyfbrop3IhMyjfIspwT7ytuIQcL1Rjl4vPdIR0U59IrjR
6YYeBoEwuj6syOzZW4eJSA==
-----END PRIVATE KEY-----
JavaScript

公密钥样例

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu/EO9dYNlbeYcEf9fy11
Ka3swVoEEHZbvKwr33RMV7cw56ott5xVY+YlNIge6vO4s5Kh24TwofaTcYeUVK+P
yC2BVfSdFk2LaGwRgvkyXLwsLlyBwkvx4/LRN1xjG1eBgd5qSqIogZKGdfaaM4Up
RptNgfji2nwgasD/2NiPtRy4NsJfVU2G+DD1ZS6+36F74j4V+YR8W9CePIo2tG8R
rw9NAru1B1Gf0ZyB8qLRTrB1FdYZ8ktPqYXiZbDNKLpQbQ8UDP/bTE8aStxgvhEk
nDQoySvhWm1jBTXtyLIMB3x97SU21NVVZSbzBynhGGkYJlcHNv12Ypb1324+G5Th
iwIDAQAB
-----END PUBLIC KEY-----
JavaScript

最后提供一下完整的源码,希望对大家的开发有所帮助