当前位置: 首页 > 知识库问答 >
问题:

使用RSA的文件加密

别锐
2023-03-14

我正在尝试实现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

共有1个答案

羊舌承
2023-03-14

问题是,正如你所说,在这一步:

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.密钥)单位不能应用于