我不会为AES或其他加密方式打开该线程,因为这是我将用于加密AES和其他加密方式的密钥的内容。我已经从StackOverflow和其他一些站点收集了一些代码,并对其进行了编辑,以使其适合我的程序。但是,在尝试使用RSA问题逐块加密时,我只能加密大小为1
KB的小型文本文件。文本文件的加密和解密工作正常。然而,加密图片和的任何文件 较大 超过1千字节会产生一个 空白的 加密文件。
我想问一下是否有人可以帮助我指出代码段导致大于1
KB的文件导致空白输出文件/加密文件的问题。这段代码适用于AES,但是我不确定为什么它不适用于RSA加密。问题开始于Encrypt_File
它读取循环的某个地方。
码:
public static final String ALGORITHM = "RSA";
private static final short KEY_LENGTH = 1024;
private static final short KEY_BYTES = 32;
private static final String CIPHER_EXTENSION = ".cgfile";
public void Encrypt_File(Path path_fileToEncrypt) {
//get file name and the new file name
String fileName = path_fileToEncrypt.getFileName().toString();
String encryptedFileName = fileName+CIPHER_EXTENSION;
String pathToEncryptedFile = path_fileToEncrypt.getParent()+File.separator+encryptedFileName;
//attempt to open the public key
try (ObjectInputStream publicKeyFile = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE))) {
//load the key
PublicKey publicKey = (PublicKey) publicKeyFile.readObject();
// load file to encrypt and inputstream
FileInputStream fileInputStream = new FileInputStream(new File(path_fileToEncrypt.toString()));
// init the cipher
final Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(pathToEncryptedFile),cipher);
byte[] buffer = new byte[KEY_BYTES];
int count;
while((count = fileInputStream.read(buffer))>0){
cos.write(buffer, 0, count);
}
//close
fileInputStream.close();
cos.close();
//delete fileToEncrypt since we have the encrypted file now
DeleteFile(new File(path_fileToEncrypt.toString()));
System.out.println("Finished encrypting "+ fileName +" It's new file name is "+ encryptedFileName);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
CGcipher rsaencrypt = new CGcipher();
Path pathTosecret = Paths.get(System.getProperty("user.dir"), "pic.png");
// Encrypt the string using the public key
rsaencrypt.Encrypt_File(pathTosecret);
//rsaencrypt.Decrypt_File(pathTosecret);
} catch (Exception e) {
System.out.println(e.toString());
}
}
尽管RSA算法在内部已扩展"RSA/ECB/PKCS1Padding"
为由Sun提供程序使用。但是,实际上并未使用ECB模式。它应该已经命名"RSA/None/PKCS1Padding"
。因此RSA无法实现更大的数据,CipherOutputStream
因为它未实现任何分组密码模式。
不幸的是CipherOutputStream
有“吃”异常的讨厌习惯。这就是为什么您得到一个空字符串而不是一个清晰的警告的原因。
Java的问题之一是检查异常。尽管它们肯定有其好处,但特殊情况不应成为函数定义的一部分。检查异常是产生可靠/无错误代码的一种很好的方法,但却是错误的方法。
IOException
流可能抛出的,这使它非常清楚。并非所有流实际上都执行I / O,因此异常是错误的。但是因为IOException
是一个
检查异常, 所以它 必须 是write
方法定义的一部分。另一方面,安全性例外具有称为的已 检查
基类GeneralSecurityException
。这些异常 不能 由流抛出,因为它们没有在方法定义中定义。
现在可以解决此问题,例如创建一个secureWrite
确实引发异常的其他方法。通常的write
方法可能会抛出RuntimeException
带有原始的新派生异常GeneralSecurityException
。不过,这些解决方案似乎已经使密码流的设计者逃脱了。相反,他们选择完全删除这些异常,或者可能会IOException
在预期出现其他异常的地方抛出该异常。
因此,应非常谨慎地使用密码流。用专有实现替换它们似乎是最好的。
代码https://play.golang.org/p/CUEqjsJq5c 错误: 文件大小811字节(用于测试加密自源文件)。我想加密一些更大的文件,1。。500 mb。我可以用RSA来做吗?或者需要使用其他方法吗?
我不完全确定我该做什么了。我一直在网上到处乱翻东西,通读例子,但它们似乎都是如何加密一整个文件,或者只是加密一段数据,除了立即再次解密之外什么也不做。我该如何处理逐行书写?
文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?
我正在尝试实现RSA算法。我想加密一个图像。问题是当解密完成时,文件无法读取。我不知道问题到底出在哪里。这是RSA的实现: 这是主要方法: 这是加密方法: 这是解密方法: 阅读和写作的方法如下所述:http://www.java2s.com/Code/Java/File-Input-Output/Readfiletobytearrayandsavebytearraytofile.htm
我正在尽我最大的努力创建一个程序,它将生成一个私有/公共RSA密钥集,并使用它发送消息,从端到端是安全的。我正在使用RSA私钥/公钥对来安全地传输AES密钥,该密钥将用于发送消息。 当我使用1024位密钥对时,加密的会话密钥是128字节。但在试图用RSA私钥解密时,它抱怨说只能解密117字节或更少的字节。 当我使用2048位的密钥对时,加密的会话密钥是256字节(但必须是245或更少),等等。 结
我已经在Android中生成了以下公钥。 我选择的RSA密钥大小是4096字节,指数是3字节,模数是512字节 模数字节数组如下所示: [-32, -28, -121, 32, 109, -82, 43, 115, 43, -117, 20, 35, 122, 33, -2, 23, 23, -22, 75, 0, 91, 10, -89, 48, 33, -89, 57, 1, 57, -13,