繁体   English   中英

如何从作为ByteString接收的密钥创建java.security.publicKey-OAEP填充

[英]How to create java.security.publicKey from a Key recived as a ByteString - OAEP Padding

我有一个用go编写的gRPC服务器,它为用Java编写的客户端提供公钥。 该密钥使用带有sha-256的OAEP填充,并且以我认为是PEM格式的ByteString形式接收。

我正在尝试读入接收到的字节并将其放入要用于解密的PublicKey对象中

转到服务器代码段:

plaintext, err := rsa.DecryptOAEP(sha256.New(), rng, d.decKey, ciphertext, label)
if err != nil {
    log.Fatalf("Error from decryption: %s\n", err)
}

// H := H'
return plaintext

RSA密钥

这是我执行client.getKey()。toString()时打印到控制台的键

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5SuTn/IhVfLpcgEtbkty
ip6ajx8tcVNt862lj24cz/zGEqzD3sDaRaS+9l16l63T/mWutPqyCBWekg9oGK6Z
ni313nJyvMETCY1kc9mj7IB9yNd00eXr+jYJNF92qc3k0IlyxDjD6hE/InlKn1cM
njYOMYhZtsMSQQElIeYsiqOD1k55E4905XP8gh3K5YT8jVBHJHboJiXVqBJ0CQPq
LKYufey+WcX3p5wKKUgycKxB1zgS1BAHJ/l9x6fxDTE85CBIeRyfSXijHgiWGAEY
MDOIRIBpA8MT5q0Mghy9+KryIHNkc+659DAgCjghY8pmyFezF5gDzRpEi+jB5OOT
bQIDAQAB
-----END RSA PUBLIC KEY-----

我一直试图将其解析为字符串,剥离“ ----- BEGIN RSA PUBLIC KEY -----”和“ ----- END RSA PUBLIC KEY -----”并转换剩余的字符串到字节数组,然后到PublicKey对象

Java代码

String key = client.getPublicKey(nonce).getRSAEncryptionKey().toString();
key = key.replace("-----BEGIN RSA PUBLIC KEY-----\n", "");
key = key.replace("-----END RSA PUBLIC KEY-----", "");
byte[] keyBytes = Base64.getDecoder().decode(key); //bytes of key
Cipher cipher_RSA;
        try {
            cipher_RSA = Cipher.getInstance("RSA");
            X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey pk = keyFactory.generatePublic( spec);

            cipher_RSA.init(Cipher.ENCRYPT_MODE, pk); 
            return cipher_RSA.doFinal(message);
        }catch(Exception e){}

这样会一直导致“非法base64字符”。 我认为这与密钥使用OAEP填充有关。 但是,当我将密钥工厂/密码的实例更改为“ RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING”时,会收到此错误:

java.security.NoSuchAlgorithmException: RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING KeyFactory not available

不同的base64解码器对于在遇到非法base64字符时是否引发异常还是仅忽略该字符有不同的规则。 空格(包括换行符)不是有效的base64字符。 要更正错误,您必须在base64解码之前简单地从PEM公钥字符串中删除换行符。

key = key.replace("-----BEGIN RSA PUBLIC KEY-----\n", "");
key = key.replace("-----END RSA PUBLIC KEY-----", "");
// add the following line  
key = key.replace("\n", "");

注意:这被简化了,因为它假定'\\ n'将是行分隔符。 您还可以将替换添加到其他常见的行分隔符字符序列中。 确保按长度顺序订购替换件,最长者优先,最后者最短。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM