我试图通过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。
谢谢!
答案 0 :(得分:0)
如果你想识别拥有私钥的人,因此拥有该文件,我想你正在寻找的过程是“数字签名”(而不是加密),如评论@EJP
使用哈希算法(如SHA-256 )消化文件。创建几个字节“hash”
使用RSA私钥对哈希进行签名。这被称为“签名”
将文件和签名发送给第三方。他们可以使用公钥验证签名。如果签名匹配,那么您可以确保消息的发件人的身份和尚未更改的身份
在这种情况下,案例文件未加密,经过哈希处理和签名。
如果您需要加密以隐藏内容,则无法使用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);