如何读取rsa公钥形式的字符串(由java生成,我想用Python读取)

杨文森:

该代码生成的公钥是

    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 -----”,没有什么不同。

dave_thompson_085:
  1. 您正在使用“ 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进行解码(许多解码器可以处理缺少填充,并且至少有些可以处理有或没有规范的两个字符集)并按原样使用。

  2. Java(它不精确地称为"X.509")以及OpenSSL和其他一些东西使用的公钥编码是通用的,并且包含算法标识符,因此正确的PEM标签是-----BEGIN PUBLIC KEY-----------END PUBLIC KEY-----(NO RSA)。

  3. 你不说的Java你用什么,但它显然默认为1024位RSA的,这是过时了好几年,不再被认为是提供足够的安全边际(虽然没有打开的报告尚未实际上打破它) 。2048现在被广泛认为是最小值,并且出于各种原因,某些应用程序或环境使用的数量更多。但是,决定使用什么加密参数(以及您的应用程序是否甚至应该使用RSA,以及如果使用的是哪种变体),都不是编程问题,也不是SO的话题。它们属于crypto.SX(用于基本原理)或security.SX(用于应用程序)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从字符串创建RSA公钥

Java:如何从字符串创建RSA公钥

如何在Java中将文件(由URL寻址)读取为字符串?

从字符串生成Rsa公钥

开始-如何从字符串设置RSA公钥模数?

如何在Java中读取rsa公钥文件?

使用Java将RSA公钥导出到PEM字符串

如何使用Bouncycastle Java将PGP公钥存储和读取为字符串?

使用PHP生成公钥/私钥对并将公钥导出为.der编码的字符串

我有一个RSA公钥指数和模数。如何使用Python加密字符串?

如何使用OpenSSL API从其PEM格式字符串读取RSA公钥?

如何在iOS中使用RSA公钥加密和解密字符串(纯文本)

我的输入始终以字符串而不是int的形式读取,如何解决此问题

在Python中以字符串形式读取gz文件

如何使用BouncyCastle C#将RSA公钥转换为字符串

如何使用scanf读取由/分隔的字符串

java:使用从PEM文件读取的RSA公钥解密数据时,如何避免IllegalBlockSizeException?

如何从以十六进制编码的字符串形式给出的模数和指数构造公钥?

Android Java-使用RSA公钥.PEM加密字符串

无法读取RSA公钥

使用字符串生成公钥和私钥

使用给定的RSA公钥OpenSSL加密字符串

python-列表以字符串形式从csv中读取

如何在Python中以字符串形式读取input()

如何读取由字符串组成的字典作为键

无法读取由strtok函数生成的字符串

从字符串 Crypto++ 导入 RSA 公钥/私钥

在节点中读取 Java 生成的公钥

如何使用 python Openssl 公钥加密字符串?