RSA公钥格式PKCS#1,PKCS#8互转(微信获取RSA加密公钥)

本文详细介绍了如何使用Java代码和OpenSSL命令将RSA公钥在PKCS#1和PKCS#8格式之间进行转换。通过具体示例展示了不同格式的公钥,并提供了一段Python脚本来批量处理密钥文件。
/把RSA公钥格式PKCS#1转换成PKCS#8
        org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPublicKey =  org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(
org.bouncycastle.util.encoders.Base64.decode(publicKeyString));

        java.security.spec.RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(rsaPublicKey.getModulus(), rsaPublicKey.getPublicExponent());

        java.security.KeyFactory keyFactory = java.security.KeyFactory.getInstance("RSA");

        java.security.PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

复制代码

RSA公钥格式PKCS#1,PKCS#8互转说明(命令的方式)

  1. PKCS#1 转 PKCS#8:

openssl rsa -RSAPublicKey_in -in <filename> -pubout

  1. PKCS#8 转 PKCS#1:

openssl rsa -pubin -in <filename> -RSAPublicKey_out

 

  1. PKCS#1 格式密钥:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEArT82k67xybiJS9AD8nNAeuDYdrtCRaxkS6cgs8L9h83eqlDTlrdw
zBVSv5V4imTq/URbXn4K0V/KJ1TwDrqOI8hamGB0fvU13WW1NcJuv41RnJVua0QA
lS3tS1JzOZpMS9BEGeFvyFF/epbi/m9+2kUWG94FccArNnBtBqqvFncXgQsm98JB
3a62NbS1ePP/hMI7Kkz+JNMyYsWkrOUFDCXAbSZkWBJekY4nGZtK1erqGRve8Jbx
TWirAm/s08rUrjOuZFA21/EI2nea3DidJMTVnXVPY2qcAjF+595shwUKyTjKB8v1
REPB3hPF1Z75O6LwuLfyPiCrCTmVoyfqjwIDAQAB
-----END RSA PUBLIC KEY-----

 

  1. PKCS#8 格式密钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArT82k67xybiJS9AD8nNA
euDYdrtCRaxkS6cgs8L9h83eqlDTlrdwzBVSv5V4imTq/URbXn4K0V/KJ1TwDrqO
I8hamGB0fvU13WW1NcJuv41RnJVua0QAlS3tS1JzOZpMS9BEGeFvyFF/epbi/m9+
lkUWG94FccArNnBtBqqvFncXgQsm98JB3a42NbS1ePP/hMI7Kkz+JNMyYsWkrOUF
DCXAbSZkWBJekY4nGZtK1erqGRve8JbxTWirAm/s08rUrjOuZFA21/EI2nea3Did
JMTVnXVPY2qcAjF+595shwUKyTjKB8v1REPB3hPF1Z75O6LwuLfyPiCrCTmVoyfq
jwIDAQAB
-----END PUBLIC KEY-----

 

 

#!/usr/bin/env python
# coding: utf8
#***************************************************************************************************

import argparse
import sys, glob, os
import xml.etree.ElementTree as xmltree

#***************************************************************************************************
class dsn(object):
  class AccessDSNFileError(Exception):
    pass

  class InvalidDSNFileFormat(SyntaxError):
    pass

  def __init__(self, **kwargs):
    if 'file' in kwargs:
      self.dsn = None
      self.pubkey = None
      try:
        xml = xmltree.parse (kwargs['file'])
        if xml:
          f_device = xml.getroot ()
          if f_device.tag == 'f-device':
            for child in f_device:
              if child.tag == 'dsn':
                self.dsn = child.text
              elif child.tag == 'public-key':
                self.pubkey = child.text

        if self.dsn is None or self.pubkey is None:
          raise SyntaxError

      except SyntaxError:
        raise dsn.InvalidDSNFileFormat
      except:
        raise dsn.AccessDSNFileError

    elif 'dsn' in kwargs and 'pubkey' in kwargs:
        self.dsn    = kwargs['dsn']
        self.pubkey = kwargs['pubkey']

#***************************************************************************************************
# main
if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('dsn_file', help='DSN file')
  args = parser.parse_args()

  for file in glob.glob (args.dsn_file):
    try:
      info = dsn (file=file)
      BEGIN = '-----BEGIN PUBLIC KEY-----'
      END = '-----END PUBLIC KEY-----'
      with os.popen ('openssl rsa -pubin -RSAPublicKey_in << END\n' + info.pubkey + '\nEND\n') as f:
        pubkey = f.read ()
      i1 = pubkey.find (BEGIN)
      i2 = pubkey.find (END)
      if i1 >= 0 and i2 > i1:
        pubkey = pubkey[i1+len (BEGIN):i2]
        pubkey = pubkey.replace ('\n', '')

      print
      print 'id dev_id {}'.format (info.dsn)
      print 'file start 0'
      s = pubkey
      len = 80
      while s:
        print 'file add {}'.format (s[:len])
        s = s[len:]
      print 'conf save'
    except:
      import traceback
      traceback.print_exc ()

#***************************************************************************************************
 

 

微信企业付款到银行卡(包含获取微信端的RSA公钥)参考文章:

https://www.jianshu.com/p/efb1dcce6e4a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值