erlang的RSA签名与验签
1.RSA介绍
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对
其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,
私钥则为自己所有,供解密之用。解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送
到解密者,解密者用私钥解密将密文解码为明文。
以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保
存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。
接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进
行解码了。以上就是RSA算法的工作流程。
2.生成签名与验签流程
生成签名方:首先对参数放入一个字符串数组signFields,把参数和值放入一个对象或map中,使用JSONObject把这个对象转化成json对象。
然后构建签名原文,在构建签名原文时,我们需把参数按照字典(比如a,b,c)顺序排序,具体排序方法直接调java的Arrays.sort方法。 然后使用RSA
的私钥对签名原文进行签名。
验签方:和生产签名方一样先生成签名原文,然后使用RSA的公钥、生成签名方传入的签名及签名原文对生成签名方传入的签名进行验证,验
证结果为true说明验证成功,否则为未通过。
RSA签名校验
-spec check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) -> boolean when
DataBin :: binary(),
Sign :: binary(),
RSAPublicKeyBin :: binary()
DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512'.
check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) ->
PemEntries = public_key:pem_decode(RSAPublicKeyBin),
RSAPubKey = public_key:pem_entry_decode(hd(PemEntries)),
Base64Sign = base64:decode(Sign),
public_key:verify(DataBin, DigestType, Base64Sign, RSAPubKey).
产生RSA签名
-spec gen_rsa_sign(MsgBin, DigestType, KeyBin) -> binary() when
MsgBin :: binary(),
DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512',
KeyBin :: binary().
gen_rsa_sign(MsgBin, DigestType, KeyBin) ->
[Entry] = public_key:pem_decode(KeyBin),
RSAPriKey = public_key:pem_entry_decode(Entry),
SignBin = public_key:sign(MsgBin, DigestType, RSAPriKey),
base64:encode(SignBin).
例子:
-module(rsa_test). -compile([export_all]). -define(RSA_PUBLIC_KEY, <<"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAviTwX/3TPgo1YCDW4/Za
aoerPaszmR7BxwdSC79JMAV/kniPBwqlB5EaIKSGw/bG0ciu8wcwEwZuADVO1sNo
blo/O6r74i7i/90h/kJy8xI+BqGl0HccHOhC+yTA+wBXyYR8dkkqbNRJfwq0/cuf
5HIFi8r6dWMEEDytOiAcyUpZzgFj6cZ5JYJkkIqecm0QfnyZdY97l8s4zgIEFPC1
7fOP3h5QvjL76G9lADd37m1VhqUvCp0DZfbXxe8CtBQGJmVG11YkwrTQEQploDPZ
p0GdOgfw/1gx7D5Y18ucfQHye6f/GM9+vkjuxIxf1YXxnxcwtFWEhjfviPHxWSZ8
kQIDAQAB
-----END PUBLIC KEY-----">>). -define(RSA_PRIVATE_KEY, <<"-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAviTwX/3TPgo1YCDW4/ZaaoerPaszmR7BxwdSC79JMAV/kniP
BwqlB5EaIKSGw/bG0ciu8wcwEwZuADVO1sNoblo/O6r74i7i/90h/kJy8xI+BqGl
0HccHOhC+yTA+wBXyYR8dkkqbNRJfwq0/cuf5HIFi8r6dWMEEDytOiAcyUpZzgFj
6cZ5JYJkkIqecm0QfnyZdY97l8s4zgIEFPC17fOP3h5QvjL76G9lADd37m1VhqUv
Cp0DZfbXxe8CtBQGJmVG11YkwrTQEQploDPZp0GdOgfw/1gx7D5Y18ucfQHye6f/
GM9+vkjuxIxf1YXxnxcwtFWEhjfviPHxWSZ8kQIDAQABAoIBAD/SylSOMI/MgWoI
29ic4nCLpXEHvEQTTNvvmxySUpCp585UZT3p1scZb3mxgALbHJViFUdCDGL2b4nm
WtY/tRgFduAiXnXnYw6bPUPJLihk4Sj8rVmyAV+6nnEKPzSBQvZDYDucB3+MKjdY
crQV20+k7jOkKDmqyLxigYrXKJJvq9LzJk9ShXBtZq4voWGlttjYIKIL76cM1BiF
+msjBI82PUVnDOMU2t7niN6ppwwZaBE3MLFbN52diO+ziYW3gT6k7yCNd9PH1XWH
cLNwUjQZXM7uUTzih336+gFjwC/42gBq6zBHHkFmIfqfX0qLp0UMFXOBZLZu3gJ1
nv4hnVkCgYEA8MysfaYSIBt5pxQZwL+CTcuf84DUQKfdfsIbwAsFO+BaBsh17FR4
jk23/qQU46Ko4cPg4NSDnao4WIaL/89Gqf01sy1xAxCjqlpURT9KoZIksyV0mp12
Kw9W+a8Dbk9NqnOE2C0UjbJl2hDt37FS+DQYUkGjQMF7ofOjmM6M8kMCgYEAyiWs
9PIF/LJlAxUqsohPsqHuBHMnWGo7eYNMbm660AcYxf/AnjPxbVnkKPVk0qbz9Eb6
AGuh5J4908ps16JvBBBZeWRvnM4SEFrVzQVn3JWMb9ZlNGkN5T+Di8vTN7N/zAI2
/J3TZbGlXPwI5A+u2FwJkc8KhTgpD64TJBsnGpsCgYEAscOXLybzSIqf80zuehGm
40GIcl3P029ZH6OyksJP+dT1AP7pty7g1MThKPX+idHh9NEC6VdZVoJ8GDYzkgR1
uTY5d237ePTGrhMDFR/VO5PEzg+/lgjaXI11etvNn5ih0Ex5bJFTFAv4DtTilnm0
s5DZx5e3Ki3r1DIlur/44zsCgYBR8S/JIwp2QsJbm4rxT/wuhyF6wEsktfth6G1l
HpGvnhDWwjOMbbXiA9xPFhpGodKmJNdWsEqx58tcPOQeDQQ/e3kpkiMERyxfYNLm
BtjxO9Xvx9LCigtN8I8cbgUywRp+0i8D+94jjP1hUfEwsYLIxZZDes/i7L8IUiIE
MtWJHQKBgQCCfvf+wGBJHpSX4ehHUgyvjjnaYE1UQzKspE+zFDZlqZDRiN3V2Qgu
TM7rHyN61rECfACaDISWEPuGKntyVD98xNg9pdNl1pABVfP+msCPwvjNLYysKnwc
GL+GEGGjvFEd6c0Ai+sobxs/cftbhzakZrBXvIjis/GTuKN/90uIVA==
-----END RSA PRIVATE KEY-----">>). test() ->
DataBin = make_data(),
Sign = gen_rsa_sign(DataBin, 'sha', ?RSA_PRIVATE_KEY),
check_rsa_sign(DataBin, Sign, ?RSA_PUBLIC_KEY, 'sha'). % -spec check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) -> boolean when
% DataBin :: binary(),
% Sign :: binary(),
% RSAPublicKeyBin :: binary()
% DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512'.
check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) ->
PemEntries = public_key:pem_decode(RSAPublicKeyBin),
RSAPubKey = public_key:pem_entry_decode(hd(PemEntries)),
Base64Sign = base64:decode(Sign),
public_key:verify(DataBin, DigestType, Base64Sign, RSAPubKey). % -spec gen_rsa_sign(MsgBin, DigestType, KeyBin) -> binary() when
% MsgBin :: binary(),
% DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512',
% KeyBin :: binary().
gen_rsa_sign(MsgBin, DigestType, KeyBin) ->
[Entry] = public_key:pem_decode(KeyBin),
RSAPriKey = public_key:pem_entry_decode(Entry),
SignBin = public_key:sign(MsgBin, DigestType, RSAPriKey),
base64:encode(SignBin). make_data() ->
<<"123456">>.
上面的公钥和私钥可以使用RSA的相关工具也可以使用在线的web工具生成。

注:可把上面的公钥和私钥放在文件中,然后读文件处理。可以把key放在文件中,如pub.key 和pri.key,具体如下:
test() ->
DataBin = make_data(),
% Sign = gen_rsa_sign(DataBin, 'sha', ?RSA_PRIVATE_KEY),
{ok, PriKey} = rsa_private_key(),
Sign = gen_rsa_sign(DataBin,'sha', PriKey), % check_rsa_sign(DataBin, Sign, ?RSA_PUBLIC_KEY, 'sha').
{ok, PubKey} = rsa_public_key(),
check_rsa_sign(DataBin, Sign, PubKey, 'sha'). % -spec check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) -> boolean when
% DataBin :: binary(),
% Sign :: binary(),
% RSAPublicKeyBin :: binary()
% DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512'.
check_rsa_sign(DataBin, Sign, RSAPublicKeyBin, DigestType) ->
PemEntries = public_key:pem_decode(RSAPublicKeyBin),
RSAPubKey = public_key:pem_entry_decode(hd(PemEntries)),
Base64Sign = base64:decode(Sign),
public_key:verify(DataBin, DigestType, Base64Sign, RSAPubKey). % -spec gen_rsa_sign(MsgBin, DigestType, KeyBin) -> binary() when
% MsgBin :: binary(),
% DigestType :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512',
% KeyBin :: binary().
gen_rsa_sign(MsgBin, DigestType, KeyBin) ->
[Entry] = public_key:pem_decode(KeyBin),
RSAPriKey = public_key:pem_entry_decode(Entry),
SignBin = public_key:sign(MsgBin, DigestType, RSAPriKey),
base64:encode(SignBin). make_data() ->
% <<"123456">>.
list_to_binary(md5:test()). read_rsa_key(FileName) ->
file:read_file(FileName). rsa_public_key() ->
read_rsa_key("pub.key"). rsa_private_key() ->
read_rsa_key("pri.key").
其实,注意2点即可:
1)公钥加密,私钥解密;
2)私钥负责签名,公钥负责验证。
erlang的RSA签名与验签的更多相关文章
- Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】
作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...
- .Net C# RSA签名和验签
帮助类 using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace ...
- java/php/c#版rsa签名以及验签实现
本文为转载,请转载请注明地址: 原文地址为 http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的 ...
- .NET Core RSA 签名和验签(密钥为 16 进制编码)
使用 OpenSSL 生成公私钥对,命令: $ openssl genrsa -out rsa_1024_priv.pem $ openssl pkcs8 -topk8 -inform PEM -in ...
- .Net C# RSA签名和验签重写
namespace com._80community.unittest.CUP { /// <summary> /// CUP Client /// </summary> pu ...
- RSA签名、验签、加密、解密
最近在做一个项目,与一个支付渠道进行连接进行充值,为了安全,每个接口访问时,都要先登陆(调用登陆接口),拿到一个sessionKey,后续业务接口内容用它来进行3DES加密处理.而登陆需要用到RSA进 ...
- RSA签名和验签Util
目录 1.DigitalSign类 2.CryptException异常类 3.加签示例 1.DigitalSign类 import org.apache.commons.codec.binary.B ...
- .NET RSA解密、签名、验签
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Sec ...
- Delphi支付宝支付【支持SHA1WithRSA(RSA)和SHA256WithRSA(RSA2)签名与验签】
作者QQ:(648437169) 点击下载➨Delphi支付宝支付 支付宝支付api文档 [Delphi支付宝支付]支持条码支付.扫码支付.交易查询.交易退款.退款查询.交易撤 ...
随机推荐
- Sql Server 2005 中的row_number() 分页技术
原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CRE ...
- 19年的桌面KDE的风雨和陪伴,没有什么能够割舍
概述 KDE是史上功能最强大的桌面环境之一:开源且可自由使用.19年前,1996年10月14日,德国程序员 Matthias Ettrich 开始了这个美观的桌面环境的开发.KDE 提供了用户界面以及 ...
- 从头开始写项目Makefile(十):make内嵌函数及make命令显示【转】
转自:http://blog.csdn.net/shallnet/article/details/38314473#comments 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章 ...
- css 之 position定位
position属性一共有4个值,分别是static.absolute.relative.fixed. static为默认值,指块保持在原本应该在的位置上,即该值没有任何移动的效果. absolute ...
- 模块(python的标准库)
在python中叫做模块,其他语言中叫做类库.python中的模块有三种:内置模块,第三方模块,自定义模块. 模块的使用: 先导入,import+模块名,再使用,模块名+函数名() .py文件与.py ...
- PHP操作MongoDB(增删改查)
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似.PHP7以前的版本和PHP7之后的版本对MongoDB的操 ...
- VS恢复默认设置
通过“导入和导出设置”实现VS恢复默认设置 1.快捷步骤 工具 → 导入和导出设置 → 重置所有设置 → 下一步 → 选择“是否保存当前设置”,下一步 → 选择“要重置的开发语言(如,Visual C ...
- 详解UIView的frame、bounds和center属性
From: http://ios.wpjam.com/2011/08/29/uiview-frame-bounds-center/ 1.概要 翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下 ...
- go--互斥锁
解读: main函数里调用了两次lockPrint方法,这个方法中的println(i, "in lock")这句话,由于是在Mutex的Lock和Unlock之间,所以在第一次调 ...
- selenium用法 (python)
滑动到指定元素位置 browser.find_element_by_xpath("//font[text()='资产管理部经办人'][1]").location_once_scro ...