我正在尝试实现RSA算法。我想加密一个图像。问题是当解密完成时,文件无法读取。我不知道问题到底出在哪里。这是RSA的实现:
import java.awt.image.BufferedImage;
import java.math.BigInteger;
import java.util.Random;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class RSA {
private BigInteger p;
private BigInteger q;
private BigInteger N;
private BigInteger phi;
private BigInteger e;
private BigInteger d;
private int bitlength = 1024;
private Random r;
public RSA() {
r = new Random();
p = BigInteger.probablePrime(bitlength, r);
q = BigInteger.probablePrime(bitlength, r);
N = p.multiply(q);
phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
e = BigInteger.probablePrime(bitlength/2, r);
System.out.println("e : "+e);
while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0 ) {
e.add(BigInteger.ONE);
}
d = e.modInverse(phi);
}
这是主要方法:
public static void main (String[] args) throws IOException
{
RSA rsa = new RSA();
byte[] bytesImage= rsa.readBytesFromFile(new File(
"F:\\calla.jpg"));
//readBytesFromFile: method to read file as bytes
byte[] encrypted = rsa.encrypt(bytesImage);
writeBytesToFile(new File(
"F:\\encryptedcalla.jpg"),encrypted );
//writeBytesToFile: method to write as bytes
// decrypt
byte[] decrypted = rsa.decrypt(encrypted);
writeBytesToFile(new File(
"F:\\decryptedcalla.jpg"),decrypted );
}
这是加密方法:
// Encrypt image
public byte[] encrypt(byte[] image) {
byte[] encryptedImage = new byte[image.length];
for (int i =0 ; i< image.length; i++){
encryptedImage[i]= (BigInteger.valueOf(image[i])).modPow(e, N).byteValue();
}
return encryptedImage;
}
这是解密方法:
public byte[] decrypt(byte[] image) {
byte[] decryptedImage = new byte[image.length];
for (int i =0 ; i< image.length; i++){
decryptedImage[i]= (BigInteger.valueOf(image[i])).modPow(d, N).byteValue();
}
return decryptedImage;
}
阅读和写作的方法如下所述:http://www.java2s.com/Code/Java/File-Input-Output/Readfiletobytearrayandsavebytearraytofile.htm
问题是,正如你所说,在这一步:
encryptedImage[i]= (BigInteger.valueOf(image[i])).modPow(e, N).byteValue();
问题是,modPow()
返回一个1024位的数字,您试图将其填充到一个8位字节中。如果你丢失了一些信息,那么你就无法解密消息。
RSA是一种数学密码术:您必须将消息编码为一个数字,然后通过计算一个函数将该数字转换为另一个数字来加密(这是modPow(e,N))。然后你必须传输整个加密的消息号码。
消息的接收者获取加密的数字,并通过解密函数modPow(d,N)运行它,该函数应返回原始数字,然后可以将其转换回原始消息。
但是收件人必须获得整个1024位数字才能进行解密。
如果使用RSA加密图像的每个字节,那么对于加密算法中的每个字节,必须向收件人发送1024位数据包。然后收件人可以解密该数据包,并提取原始字节。
或者,您可以一次加密两个字节,或者十个字节,或者100个字节;但是你不能让“数据包”小于1024位。
问题内容: 我正在使用PyCrypto通过RSA实现文件加密。 我知道这有点不对,首先是因为RSA速度很慢,其次是因为PyCrypto RSA只能加密128个字符,因此您必须以128个字符的块来爆炸文件。 到目前为止的代码是: 所以我的问题是:是否有更好的方法在文件上使用私钥/公钥加密? 我听说过Mcrypt和OpenSSL,但是我不知道它们是否可以加密文件。 问题答案: 公钥加密通常仅用于少量数
代码https://play.golang.org/p/CUEqjsJq5c 错误: 文件大小811字节(用于测试加密自源文件)。我想加密一些更大的文件,1。。500 mb。我可以用RSA来做吗?或者需要使用其他方法吗?
我使用RSA_public_encrypt函数发送加密数据到套接字。我正在读取公钥。使用"pkey=PEM_read_PUBKEY(f, NULL, NULL, NULL);"函数的PEM文件。从上面的函数中检索的pkey是类型EVP_PKEY*,我不能在函数RSA_public_encrypt中使用。(RSA_public_encrypt使用RSA*类型密钥) 如何将EVP_PKEY*PKEY转
本文向大家介绍Spring Cloud Config RSA简介及使用RSA加密配置文件的方法,包括了Spring Cloud Config RSA简介及使用RSA加密配置文件的方法的使用技巧和注意事项,需要的朋友参考一下 Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 。例如:配置管理、服务发现、断路由、智能路由、微代理、控制总线、一次性Token、全局锁、
文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?
我在尝试初始化RSA密码时遇到Scala错误: 我正在尝试读取包含公钥和私钥的PEM文件。在Bouncy城堡中读取pem文件时,我在初始化中传递与key相同的信息时出错。 我的PEM文件: 错误需要哪些更改 我的代码: 错误: 重载方法值初始化(x1美元:Int,x2美元:java.security.cert.证书)单位(x1美元:Int,x2美元:java.security.密钥)单位不能应用于