使用私钥加密5-10MB文件并使用公钥解密

时间:2016-12-21 08:26:03

标签: java encryption cryptography

我试图通过RSA使用私钥加密文件,然后使用Java中的公钥对其进行解密。我非常清楚这是RSA通常与私钥/公钥对一起使用的反向用例。

我的目标是获取一个文件,使用私钥在一个系统上对其进行加密,然后使用公钥在另一个系统上对其进行解密。我计划分发公钥,以便任何人都可以阅读该文件。我试图阻止的是任何人都可以创建该文件。

我找到了这些C头函数,并用PHP实现,所以我知道我想做的事情是可能的

 int RSA_public_encrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa, int padding);
 int RSA_private_decrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa, int padding);
 int RSA_private_encrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa,int padding);
 int RSA_public_decrypt(int flen, unsigned char *from, 
    unsigned char *to, RSA *rsa,int padding);

如何在Java中实现相同的行为?我一直在谷歌搜索和寻找东西,但也许我只是没有使用正确的话。当我试图做相反的事情时,一切都在不断地向我展示如何用公共加密和私密解密。

我要加密的文件大小范围为5-10MB。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果你想识别拥有私钥的人,因此拥有该文件,我想你正在寻找的过程是“数字签名”(而不是加密),如评论@EJP

  1. 使用哈希算法(如SHA-256 )消化文件。创建几个字节“hash”

  2. 的摘要
  3. 使用RSA私钥对哈希进行签名。这被称为“签名”

  4. 将文件和签名发送给第三方。他们可以使用公钥验证签名。如果签名匹配,那么您可以确保消息的发件人的身份和尚未更改的身份

  5. 在这种情况下,案例文件未加密,经过哈希处理和签名。

    如果您需要加密以隐藏内容,则无法使用RSA,因为邮件大小受密钥长度的限制。所以10mb太大了。在这种情况下,我建议使用像AES这样的加密算法来加密内容。

    第三方需要AES解密密钥。在此之前生成它或使用RSASA-OAEP填充(使用@Maarten Bodewes提供的链接)使用第三方的RSA公钥加密AES密钥

    生成数字签名

    Signature sig = Signature.getInstance("SHA256withRSA"); 
    sig.initSign(privateKey);
    sig.update (data)
    byte[] signature = sig.sign();
    

    验证签名

    Signature sig = Signature.getInstance("SHA256withRSA"); 
    sig.initVerify(publicKey);
    sig.update(data);  
    boolean verifies = sig.verify(signature);