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

在Java中使用RSA加密SecretKey

白星腾
2023-03-14

我正在研究一个客户机-服务器安全协议,其中我需要使用Java中的RSA来加密HMAC摘要的SecretKey,因为密钥必须发送到服务器。加密分为两个阶段;首先,我需要用一个公共非对称密钥加密对称密钥,然后,该加密消息用一个私有非对称密钥加密。

为此,我将SecretKey生成为:

public SecretKey generate(){
KeyGenerator generator = KeyGenerator.getInstance("HMACSHA256");
k = generator.generateKey();
return k;
}
public byte[] encryptPublic(PublicKey key, byte[] array){
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(array);
return encrypted;
}
  1. 如何将SecretKey转换为字节数组,以便使用RSA和公钥对其进行加密?
  2. 由于公钥加密产生128字节的字节数组,如果密钥长度为1024位,并且只能加密117字节长的消息,如何使用私钥再次加密该消息?

共有1个答案

上官凯歌
2023-03-14
  1. 如何将SecretKey转换为字节数组,以便使用RSA和公钥对其进行加密?

这叫做包装:

public static byte[] wrapKey(PublicKey pubKey, SecretKey symKey)
        throws InvalidKeyException, IllegalBlockSizeException {
    try {
        final Cipher cipher = Cipher
                .getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
        cipher.init(Cipher.WRAP_MODE, pubKey);
        final byte[] wrapped = cipher.wrap(symKey);
        return wrapped;
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw new IllegalStateException(
                "Java runtime does not support RSA/ECB/OAEPWithSHA1AndMGF1Padding",
                e);
    }
}

请注意,这不会先显式转换为byte[]。这是因为密钥很可能在硬件安全模块中。在HSM中,包装是可能的,但转换到本地内存中的字节[]通常是不可能的。

通常安全得多的ephemeral-ephemeral(EC)DH用于在传输协议中建立密钥,仅使用私钥进行身份验证。您可能希望从TLS 1.3的(草案版本)中获得一些提示。或者您可能只想使用TLS或它的握手部分。

 类似资料:
  • 问题内容: 我需要用openssl生成的和密钥替换从Unix到Java代码的加密和解密步骤 我生成密钥 我在Unix中使用键(我需要在Java中执行) 这是我的尝试 但它不起作用,PKCS8EncodedKeySpec / X509EncodedKeySpec不正确…但是我不知道该放什么 问题答案: 我认为您在读取PEM文件时遇到问题。JPA不直接支持PEM格式。您有两种选择,要么将它们转换为DE

  • 问题内容: 我有一个从Java服务器发送的公钥。在我解码并去除ASN.1标头之前,base64编码的字符串匹配。我使用将公钥存储在钥匙串中。 因此,我尝试使用公共密钥对数据进行加密,并使用Java中的私有密钥对其进行解密。我在iOS端和Java端使用。 我正在加密的是对称AES密钥,该密钥对我的实际数据进行加密,因此密钥长度为16个字节。当简单地对密钥进行base64编码时,一切正常,因此我知道此

  • 问题内容: 我试图来回编码一个简单的String“ test”。 但是,尽管加密工作得很好(ALGORITHM是“ RSA”),但是当尝试解密刚刚从加密“ test”中获得的字符串时,出现以下异常: javax.crypto.IllegalBlockSizeException:数据不得超过256个字节 我是否应该将加密的字节分成256个块才能解密? 问题答案: 您无法可靠地将随机字节转换为。结果将

  • 我在Java写一个安全的文件共享应用程序。一般的架构是这样的: 用户希望加密文件以在多个用户之间安全共享 应用程序在客户端上生成一个随机UUID,并将其用作AES 256密码,然后使用UUID对数据进行加密 然后使用每个人的公钥对UUID进行RSA加密。每个共享用户一次 每个加密的UUID数据包作为文件的一部分存储在自定义文件头中 然后将文件上载到其他人可以访问的服务器 用户可以使用各自的私钥读取

  • 我正在做一个简单的程序来加密/解密使用RSA算法在Java。我创建一个密码对象如下: 我通过调用加密函数进行加密: 解密过程如下: 但是,当我将创建密码对象的代码编辑为://Create a Cipher object Cipher rsapier=Cipher时。getInstance(“RSA”); 问题出在哪里。在第一种情况下(当空格出现时),我指定了NoPadd?为什么空格出现在解密的消息

  • 问题内容: 我正在使用PyCrypto通过RSA实现文件加密。 我知道这有点不对,首先是因为RSA速度很慢,其次是因为PyCrypto RSA只能加密128个字符,因此您必须以128个字符的块来爆炸文件。 到目前为止的代码是: 所以我的问题是:是否有更好的方法在文件上使用私钥/公钥加密? 我听说过Mcrypt和OpenSSL,但是我不知道它们是否可以加密文件。 问题答案: 公钥加密通常仅用于少量数