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),这时,就可以把获得的模数和质数给到前端了,我也可以用获得的模数和质数模拟前端加密处理了。