代码改变世界

RSA公私钥获取模数和质数

2019-04-09 23:18  wangjinxiang  阅读(3893)  评论(0编辑  收藏  举报

  实际项目中,发现前端在生成公钥对象的时候并不是使用这种方式,而是通过对应的模数跟质数来构造公钥对象的,这样的话,需要进一步将生成的公钥取出对应的模数和质数。openssl、java api都可以将质数跟模数取出来。

正常生成公私钥如下:

1.通过openssl工具取出模数和质数

  命令行使用 openssl rsa -in priKey.pem -noout -text,得到下图中的modules以及publicExponent

  这里我们都取十六进制的。这样对应的模数(前面的00去掉即可)跟质数就出来了。
2.通过java api取对应的模数跟质数

package com.wangjinxiang.genkey.util;

import java.security.interfaces.RSAPublicKey;
import org.apache.commons.codec.binary.Base64;

public class KeyModulesAndExponentUtil {

  private static String PUBKEY_TEXT = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxdHDlJrjF+anpWRbiLuN2Hu9oPaABcVKAJSCq3UEreIn33ldx645l+9RDat6THqJEeTjRt9orogXwpAeFkDqje0YFjTu4v3eyLnkGjg3oDozYCoY9c7vfQ/BMw3X+2Wy0lYpRg23qis0lWB/ZdoVnj6SP0fcXBiqJSk+/deZNVreUvozl0X1o17EyJsKGJd2Uk0ltC3DfRve0TK1TJp4pssEDLRqFPAVJSJjFEe2lr6IUKDlv9ArPRZXh67zxxe1t/qW+tJSJjhaQKFLwpYVmpNnPNuYJ7gLqLPxDiqosFVJK0q3On2IFbviaXMhwGv85GD2Exlmn9KDW4p1box6QQIDAQAB";
  
  public static void getModulesAndExponent() throws Exception {
    
    try {
      // 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
      java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
              Base64.decodeBase64(PUBKEY_TEXT));
      // RSA算法
      java.security.KeyFactory keyFactory = java.security.KeyFactory.getInstance("RSA");
      // 取公钥匙对象
      RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(bobPubKeySpec);
      
      System.out.println("modules: 0x" + pubKey.getModulus().toString(16));
      System.out.println("publicExponent: 0x" + pubKey.getPublicExponent().toString(16));
    }catch(Exception e) {
      throw e;
    }
  }
  
  public static void main(String[] args) {
    try {
      KeyModulesAndExponentUtil.getModulesAndExponent();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

  打印出来的结构跟使用openssl工具是一样的。

  至此,这两种方法都可以正确取出模数(modules)和质数(publicExponent),这时,就可以把获得的模数和质数给到前端了,我也可以用获得的模数和质数模拟前端加密处理了。