当前位置: 首页 > 知识库问答 >
问题:

如何从作为字节字符串接收的密钥创建java.security.publickey-OAEP填充

唐钊
2023-03-14

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

我正在尝试读取接收到的字节,并将它们放入一个用于解密的公共密钥对象中

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

这是在执行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-----
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){}
java.security.NoSuchAlgorithmException: RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING KeyFactory not available

共有1个答案

漆雕昊天
2023-03-14

不同的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'将是行分隔符字符。您还可以向其他常用行分隔符字符序列添加替换。确保您按长度排序替换,最长的第一个,最短的最后一个。

 类似资料:
  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 问题内容: 我正在尝试将String传递给我的。如何通过针对读者的“测试” 而不是来自读者的输入? 问题答案: 您可以如下修改代码

  • 问题内容: 我正在遵循指南,它为我提供了以下代码: 我想知道的是如何仍然可以创建一个,但是不要读取文件的内容,而要使用一个已有的变量。 问题答案: 使用而不是。 请参阅StringReader的文档 例:

  • 问题内容: 我不习惯在Java中使用流-如何从中创建流? 问题答案: 干得好: 更新 对于多字节支持使用(感谢 Aaron Waibel 的评论): 请参阅ByteArrayInputStream手册。 在上面的String#getBytes(charset)方法中使用charset参数是安全的。 在JDK 7+之后,您可以使用 而不是硬编码的编码字符串:

  • 问题内容: 我有一个字符串形式: 依此类推(长度会有所不同)。由此创建字典的最简单方法是什么? 我知道我可以拆分,但是我无法获得正确的语法。如果我分开,那么我如何将这两个部分结合在一起? 对此进行迭代似乎很痛苦。 问题答案: 编辑:下一个解决方案是当您想要将值作为整数,我认为这是您想要的。