使用RSA公钥加密AES密钥

帽子

我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示:

// encode the SecretKeySpec
private byte[] EncryptSecretKey ()
{
    Cipher cipher = null;
    byte[] key = null;

    try
    {
        cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
        // contact.getPublicKey returns a public key of type Key
        cipher.init(Cipher.ENCRYPT_MODE, contact.getPublicKey() );
        // skey is the SecretKey used to encrypt the AES data
        key = cipher.doFinal(skey.getEncoded());
    }
    catch(Exception e )
    {
        System.out.println ( "exception encoding key: " + e.getMessage() );
        e.printStackTrace();
    }
    return key;
}

然后,我将密钥值写给接收器,并按如下方式解密:

private SecretKey decryptAESKey(byte[] data )
{
    SecretKey key = null;
    PrivateKey privKey = null;
    Cipher cipher = null;

    System.out.println ( "Data as hex: " + utility.asHex(data) );
    System.out.println ( "data length: " + data.length );
    try
    {
        // assume this loads our private key
        privKey = (PrivateKey)utility.loadLocalKey("private.key", false);

        cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
        cipher.init(Cipher.DECRYPT_MODE, privKey );
        key = new SecretKeySpec(cipher.doFinal(data), "AES");

        System.out.println ( "Key decrypted, length is " + key.getEncoded().length );
        System.out.println ( "data: " + utility.asHex(key.getEncoded()));
    }
    catch(Exception e)
    {
        System.out.println ( "exception decrypting the aes key: " + e.getMessage() );
        e.printStackTrace();
        return null;
    }

    return key;
}

在控制台的另一端,我将其作为输出:

read_bytes for key: 16
data length: 16
Data as hex: <hex string>
Key decrypted, length is 256
java.security.InvalidKeyException: Invalid AES key length: 256 bytes

此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(data)输出放入其中,则该数组的大小似乎已调整为256个字节(至少.length这样说)。为什么会这样,而且进一步,我在做错什么?

编辑
我解决了这个问题,并以为我会发布这个问题,以防有人碰到这个问题。事实证明,问题出在RSA / ECB / NOPADDING。出于某种奇怪的原因,当我将SecretKey转移到客户端时,它正在破坏我的创建。可能与生成密钥对的方式有关(我为此使用了getInstance(“ RSA”)),但我不确定。

帽子

如owlstead所述,如果不使用填充进行加密/解密,就不能仅使用“原始” RSA。一方面,它是非常不安全的;另一方面,Java库甚至不支持它。以下是使用RSA密钥对对AES密钥进行加密/解密的工作代码。

private byte[] EncryptSecretKey ()
{
    Cipher cipher = null;
    byte[] key = null;

    try
    {
        // initialize the cipher with the user's public key
        cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, contact.getPublicKey() );
        key = cipher.doFinal(skey.getEncoded());
    }
    catch(Exception e )
    {
        System.out.println ( "exception encoding key: " + e.getMessage() );
        e.printStackTrace();
    }
    return key;
}

AES密钥的解密如下所示:

private SecretKey decryptAESKey(byte[] data )
{
    SecretKey key = null;
    PrivateKey privKey = null;
    Cipher cipher = null;

    try
    {
        // this is OUR private key
        privKey = (PrivateKey)utility.loadLocalKey(
                                ConfigFrame.privateKeyLocation, false);

        // initialize the cipher...
        cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privKey );

        // generate the aes key!
        key = new SecretKeySpec ( cipher.doFinal(data), "AES" );
    }
    catch(Exception e)
    {
        System.out.println ( "exception decrypting the aes key: " 
                                               + e.getMessage() );
        return null;
    }

    return key;
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

使用Webcrypto使用RSA加密到多个公钥

来自分类Dev

如何使用OpenSSL EVP例程进行RSA公钥加密?

来自分类Dev

如何使用Python的加密模块加载RSA公钥

来自分类Dev

使用DER格式的RSA公钥文件的iOS加密

来自分类Dev

C#BouncyCastle-使用公钥/私钥进行RSA加密

来自分类Dev

Expo可以使用哪些RSA公钥加密选项?

来自分类Dev

OpenSSL:使用ECC公钥加密对称密钥

来自分类Dev

使用RSA进行AES密钥交换的AES加密通信

来自分类Dev

Ruby RSA公钥加密到Golang

来自分类Dev

在Crypto ++中使用RSA加密对称AES密钥

来自分类Dev

如何在C#RSA中使用私钥加密和使用公钥解密

来自分类Dev

带有rsa公钥字符串(不是文件)时,加密时出现错误“无效的密钥格式”

来自分类Java

RSA在Android中使用base64编码的公钥进行加密

来自分类Java

如何使用Modulus和指数/公钥快速破解Java中的大量RSA加密

来自分类Dev

使用RSA-2048服务器公钥加密客户端私钥

来自分类Dev

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

来自分类Dev

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

来自分类Java

AES 256加密:公钥和私钥如何生成和使用.net

来自分类Java

在Android中使用公钥加密

来自分类Java

在application.yml中加密RSA公钥

来自分类Dev

Golang RSA加密,错误为“无法解析公钥”

来自分类Dev

Python加密,RSA公钥/私钥,带有大文件

来自分类Dev

NodeJS加密RSA,与Elixir / Erlang公钥不兼容?

来自分类Dev

Java Server的Swift RSA加密公钥失败

来自分类Linux

openssl / RSA-使用公钥解密

来自分类Dev

使用OpenSSL生成RSA公钥/私钥?

来自分类Dev

使用RSA私钥生成公钥?

来自分类Dev

在PHP中将openssl密钥转换为rsa公钥

来自分类Java

使用ECDH公钥进行密钥包装?

TOP 榜单

热门标签

归档