该代码生成的公钥是
public static final String CHARSET = "UTF-8";
public static final String RSA_ALGORITHM = "RSA";
public static Map<String, String> createKeys(int keySize){
KeyPairGenerator kpg;
try{
kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
}catch(NoSuchAlgorithmException e){
throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");
}
kpg.initialize(keySize);
KeyPair keyPair = kpg.generateKeyPair();
Key publicKey = keyPair.getPublic();
String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());
Key privateKey = keyPair.getPrivate();
String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());
Map<String, String> keyPairMap = new HashMap<String, String>();
keyPairMap.put("publicKey", publicKeyStr);
keyPairMap.put("privateKey", privateKeyStr);
return keyPairMap;
}
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
return key;
}
然后将密钥发送给我,我想用python importKey()读取它。但是我总是收到错误“不支持RSA密钥格式”。
最关键的是“MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGrLFBqubzi45M_yxs5Ps4XW3DIOeAo5x7Ca9EYmWAig3Rb3Efm2PCgipwNube2Ae5eUI5dYlQW32FSF81rw7vNdwfODDzITyWRPLEuVbBbkF5zD6kTxycqlVbH-uTyb95181jpY_XY6tmEOCZCq3mZhil9VA4ZvAoSBcJ8muXaQIDAQAB”
用Google搜索之后,我尝试向其添加标头“ ----- BEGIN RSA PUBLIC KEY -----”,没有什么不同。
您正在使用“ URLsafe” base64编码器,尽管不是标准的Java编码器。“ URLsafe”使用不同的字符(对于代码值62和63),没有填充,也没有换行符。PEM格式(在存在URLsafe编码之前就已经设计了很长时间,实际上在存在URL之前已经过了一年!)使用传统的base64字符(现在主要与MIME相关联),填充和换行符(每64个字符)。尽管并非所有软件都检查换行符;您没有说您正在使用哪个Python密码库(有几个),所以我无法检查它是否在乎这一点。
在Java 8 up中,可以使用Base64.getMimeEncoder()
其中的大多数功能,但是如果您使用的是旧版Java(请参见下文)和/或某些其他库,则必须提供有关它的详细信息。您可以将- _
字符转换为+ /
,将=
填充添加为4的倍数,并根据需要添加换行符。
OTOH我看过的Python库接受'DER'(即二进制)以及PEM,因此您可以对base64进行解码(许多解码器可以处理缺少填充,并且至少有些可以处理有或没有规范的两个字符集)并按原样使用。
Java(它不精确地称为"X.509"
)以及OpenSSL和其他一些东西使用的公钥编码是通用的,并且包含算法标识符,因此正确的PEM标签是-----BEGIN PUBLIC KEY-----
和------END PUBLIC KEY-----
(NO RSA
)。
你不说的Java你用什么,但它显然默认为1024位RSA的,这是过时了好几年,不再被认为是提供足够的安全边际(虽然没有打开的报告尚未实际上打破它) 。2048现在被广泛认为是最小值,并且出于各种原因,某些应用程序或环境使用的数量更多。但是,决定使用什么加密参数(以及您的应用程序是否甚至应该使用RSA,以及如果使用的是哪种变体),都不是编程问题,也不是SO的话题。它们属于crypto.SX(用于基本原理)或security.SX(用于应用程序)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句