首页 > 其他分享 >Erlang 使用rsa不对称密钥进行签名和验签

Erlang 使用rsa不对称密钥进行签名和验签

时间:2023-10-17 21:03:39浏览次数:34  
标签:Key 和验 rsa public ----- key Signature Erlang Payload

背景:合作方要求使用rsa(sha256)不对称密钥进行签名和验签 erlang版本:OTP20.3

  1. 使用工具生成rsa密钥对(自行百度)获得一个公钥和私钥
    公钥内容如:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApiwI+2ZT0eWUiLQ1p6JV
Kv70ae...
-----END PUBLIC KEY-----

私钥内容如:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEApiwI+2ZT0eWUiLQ1p6JVKv70aeVATwLryqIUDjvBnPuz3Zme
XofqVjV0G35mexMmzWU1tYOWFBq0YKGimHNMcllHsw/+RrM/gMr+M2GfNWKxVJ+Q
2kfH+oRATe+HqO5x68zYlmEbkpTrrM4lriK8lOMpvetDT2RsCpKguckMADa4eTEV
/9RxSOhVghN/7XXQDOWzp9oVgkMvDN5tDkjcCidphrwc/AKZjn3httsxpU0SSZZp
0EykKv9wEhG7f66yDplU8hhg9p3iw6UceptQSV8xBn5YfY1Vsni+8z92e9sKqqq/
Ir6TxcXvWREqdii94F2TxFFRLC4t9kSx9iBxBwIDAQABAoIBADsz0xtmUJSme63c
roUD494GqaOUxr2fp8wwxH5xscAxONrJoU/Ckq2WK8Cj3vUYVKm21lTOBckx3nPT
Am/YHDNdNZtJJmmf8Q78w2Yg8Kz/dXhVxTDPhCLvvU1G+okoMrQ07jFddYpavkB5
zZjlzVQqPrPoPrnpaEi4BsVKKJlmT8kuLm4vdrzERm0kEskxzKzIfVm0tfdiLbYo
C48dfk1ve7DYr8CeWl5jnek5QIl...
-----END RSA PRIVATE KEY-----
  1. 公钥提供给合作方,并向合作方要其公钥
  2. 实现签名sign和验签verify方法
    3.1 将密钥转化成erlang能用的格式
    % 将私钥字符串(二进制)转化成erlang的#'RSAPrivateKey'{}结构体
    % 字符串可以写死在erl文件中,或者存在外部文件,通过erlang的读文件内容接口获取
    private_key() ->
      PemBin = <<"-----BEGIN RSA PRIVATE KEY-----...">>,
      [RSAPrivateKey] = public_key:pem_decode(PemBin),
      PrivateKey = public_key:pem_entry_decode(RSAPrivateKey),
      PrivateKey.
    
    % 将合作方的公钥转化成erlang的#'RSAPublicKey'{}结构体,过程同上
    public_key() ->
        PemBin = <<"-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApiwI+2ZT0eWUiLQ1p6JV
    ...
    -----END PUBLIC KEY-----">>,
        [RSAPublicKey] = public_key:pem_decode(PemBin),
        PublicKey = public_key:pem_entry_decode(RSAPublicKey),
        PublicKey.
    
    3.2 签名sign
    % Payload是binary() (我的业务还要注意是utf8编码)
    -spec sign(Payload::binary(), Key::public_key:rsa_private_key()) -> binary().
    sign(Payload, Key) ->
        Signature = public_key:sign(Payload, 'sha256', Key),
        base64:encode(Signature).
    
    3.3 验签verify
    -spec verify(Payload::binary(), Signature::binary()|iolist(), Key::public_key:rsa_public_key()) -> boolean().
    verify(Payload, Signature, Key) ->
        Signature1 = base64:decode(Signature),
        public_key:verify(type:unicode_binary(Payload), 'sha256', Signature1, Key).
    
  3. 例子
Payload = <<"abc">>,
Signature = sign(Payload, private_key())
% 自我验证的话使用自己的公钥而不是合作商提供的public_key()
true = verify(Payload, Signature, public_key())

标签:Key,和验,rsa,public,-----,key,Signature,Erlang,Payload
From: https://www.cnblogs.com/jsom/p/17770637.html

相关文章

  • Binary Tree Postorder Traversal
    SourceGivenabinarytree,returnthepostordertraversalofitsnodes'values.ExampleGivenbinarytree{1,#,2,3},1\2/3return[3,2,1].ChallengeCanyoudoitwithoutrecursion?题解1-递归首先使用递归便于理解。C++-Tra......
  • 【论文阅读】MD vs FA: Adversarial learning for small object segmentation in infr
    WangH,ZhouL,WangL.Missdetectionvs.falsealarm:Adversariallearningforsmallobjectsegmentationininfraredimages[C]//ProceedingsoftheIEEE/CVFInternationalConferenceonComputerVision.2019:8509-8518.论文试图解决什么问题?解决红外小目标的目标......
  • English conversation in real life
    常见疑问句Whatdoyoufeel?你感觉如何Doyouthinkyoucanmakeitsitdown?Yes,Ishouldmakeittothebench.你认为你能走到那里坐下来吗?是的,我应该能走到长椅那里。Whatdoyoufancy?你想做什么?Whatareyouthinking?你有什么想法?I'vegotanidea;howabo......
  • php中rsa加密解密详解
    php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密,希望能帮助到大家。1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以......
  • rsa 公共模数攻击脚本
    '''rsa3-->c1,c2,e1,e2公共模数攻击'''fromCrypto.Util.numberimport*importgmpy2'''c1=pow(m,e1,N)c2=pow(m,e2,N)''''''m=pow(c1,d1,N)m=pow(c2,d2,N)'''c1=......
  • rsa 不止一个p
    已知e,n,c,p,q(但是n?=p*q)例如:'''n=p*p*p*q*q'''importgmpy2fromCrypto.Util.numberimport*e=q=p=c=n=p*p*p*q*q'''当n分解类似p*p*pphi=p*p*p-p*p'''phi=(p**3-p**2)*(q**2-q)d=gmpy2.invert(e,phi)......
  • rsa dp泄露脚本
    已知c,e,n,dp求m(dp=d%(p-1))importgmpy2fromCrypto.Util.numberimport*n=dp=c=e=tmp=e*dp-1#根据联立条件有:e*dp=1+k(p-1),故求解p的式子为:(p-1)=(e*dp-1)/kforkinrange(1,e):#因为K上限只到e,故遍历求解iftmp%k==0:#验证(p-1)是否为整除结果......
  • rsa 最常规模板脚本
    已知c,e,n求m(n能分解p,q)importgmpy2fromCrypto.Util.numberimport*c=e=n=n=p*q#yafufactordb.com分解np= q= phi=(p-1)*(q-1)d=gmpy2.invert(e,phi)m=gmpy2.powmod(c,d,n)print(long_to_bytes(m))......
  • The 2nd Universal Cup. Stage 4: Taipei - I(状压DP)
    目录I.IntervalAdditionI.IntervalAddition题意给定一个长度为n$(1\len\le23)$的数组a。你可以进行一种操作:选择区间\([l,r]\)并给这个区间所有的数都加上一个任意的数。问你使得整个数组均为0所需的最小操作次数?思路考虑差分数组无论怎么对于区间\([l,r......
  • The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online (The 2nd Universal Cup
    The2018ACM-ICPCAsiaQingdaoRegionalContest,Online(The2ndUniversalCup.Stage1:Qingdao)J-PresstheButton\(1\leqa,b,c,d\leq10^6\)题解容易发现存在循环节,每次位于\(gcd(a,c)\)的倍数的位置所以我们考虑处理一个循环节内的情况如果\(v\le......