我正在尝试通过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中实现相同的行为?我一直在谷歌上搜索,但也许我只是用错了词。当我试图做相反的事情时,所有的东西都会告诉我如何用public加密,用private解密。
我要加密的文件大小从5-10MB不等。
谢谢!
发布于 2016-12-21 17:28:56
如果您想识别拥有私钥的人,并因此拥有文件,我猜您正在寻找的过程是“数字签名”(而不是加密),如comments @EJP
使用像SHA-256这样的散列算法对文件进行
更改
在这种情况下,文件不是加密的,而是经过散列和签名的。
如果您需要加密以隐藏内容,则不能使用RSA,因为消息大小受密钥长度的限制。所以10mb太大了。在这种情况下,我建议使用像AES这样的en加密算法来加密内容。
第三方将需要AES解密密钥。在此之前生成它,或者使用RSASA-OAEP填充使用第三方的RSA公钥加密AES密钥(根据@Maarten Bodewes提供的链接)
生成数字签名
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);https://stackoverflow.com/questions/41258223
复制相似问题