我们在安全检测的时候看到有用RSA加密对称密钥的,但是代码中看到的密钥是PEM格式,这种无法直接看出密钥到底多长,是否符合安全要求,这时候就要算出真实的密钥长度,然后判断是否符合安全要求。
生成公私钥
生成私钥
我们使用openssl工具直接生成公私钥(默认生成的是2048位):
openssl genrsa -out private8.pem
也可以生成1024位:
openssl genrsa -out private8.pem 1024
生成公钥
openssl rsa -in private8.pem -pubout -out public8.pem
通过openssl提取模和指数
openssl rsa -in private8.pem -noout -text
通过java api取对应的模数跟指数
import java.security.interfaces.RSAPublicKey;
import com.sun.org.apache.xml.internal.security.utils.Base64;
public class RSA_modulus {
private static String PUBKEY_TEXT = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwaSv68WTprFlvMUmRq8sF+ior4ZwNwX7H+d67dDiUTY/02jKLJDEbDy7B+ocH7fQNDwTGEsQreYkf23YAra7eVW4/TJZoR9MVezui9p4up0b6k0KbLzpVqsG1dQj+DfNRNq0TmQClvPbzVtyOISWMnWcUr5dLGEe5+FTGJqI72yXMelpPxIv01R9rP1PdDB+BlnMXx7e2/lmUFhs9nzvwLgehtqsbLN8bi4kjIL1R7fyQVXXEaWBRgBofE5CN48TYYK6NQlhRNjY3S7Dx6SE9PRWIj4XXs663PMXCVT9Wg9W1PyN544gk9TkbW5yFpLSbsQOTlcLzNW878jYG0q9zQIDAQAB";
public static void getModulesAndExponent() throws Exception {
try {
// 解密由base64编码的公钥,并构造X509EncodedKeySpec对象
java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
Base64.decode(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 {
RSA_modulus.getModulesAndExponent();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样两种方法分别用公钥、钥匙得到模和指数,可以看到模是一样的,指数不同,这是因为在非对称加密中,模也就是计算出来的密钥长度是一样的,但是指数分为公匙指数和私钥指数。
推荐阅读:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。