使用RSA加密图像时出错
我需要使用RSA加密151 * 15大小的图像。使用RSA加密图像时出错
这是java代码加密图像文件
import javax.crypto.Cipher;
plaintext = time;
cipher = Cipher.getInstance('RSA');
keygen = java.security.KeyPairGenerator.getInstance('RSA');
keyPair = keygen.genKeyPair();
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate())
plaintextUnicodeVals = uint16(plaintext)
plaintextBytes = typecast(plaintextUnicodeVals, 'int8')
ciphertext = cipher.doFinal(plaintextBytes);
这是要加密
我得到了folllowing出错
Java异常图像文件:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
请给我提示或程序,以便我可以正确的方向。
谢谢
您需要使用AES加密大数据。 RSA无法加密大于密钥大小的数据。 因此,您可以使用RSA加密AES密钥,并使用AES(256位)(即为每个图像生成不同的AES密钥)加密整个图像。
此外,如果要将图像拆分为大量117字节的块并逐一加密,RSA非常慢,因此不适用于加密大数据。
例如:
public static byte[] encrypt(byte[] data) {
try {
KeyPair keyPair = initalizeKeyPair();
final javax.crypto.Cipher rsa = javax.crypto.Cipher.getInstance("RSA");
rsa.init(javax.crypto.Cipher.ENCRYPT_MODE, keyPair.getPublic());
SecureRandom random = new SecureRandom();
final byte[] secretKey = new byte[16];
random.nextBytes(secretKey);
final javax.crypto.Cipher aes = javax.crypto.Cipher.getInstance("AES");
SecretKeySpec k = new SecretKeySpec(secretKey, "AES");
aes.init(javax.crypto.Cipher.ENCRYPT_MODE, k);
final byte[] ciphedKey = rsa.doFinal(secretKey);
final byte[] ciphedData = aes.doFinal(data);
byte[] result = new byte[256 + ciphedData.length];
System.arraycopy(ciphedKey, 0, result, 0, 256);
System.arraycopy(ciphedData, 0, result, 256, ciphedData.length);
return result;
} catch (... e) {
throw new SomeException(e);
}
}
其实我不得不使用RSA,虽然它需要时间。这只是一个项目来演示。如果你请告诉我如何在java中分割图像。 – shree 2012-03-26 17:37:32
您需要构建一个列表
我没有看到在加密文本的图像,而不是仅仅加密文本(这显然是低于117个字节)的值。你能在这个思考过程中启发我吗? – 2012-03-26 17:31:02
不要删除重新提出几乎相同的问题。 – CodesInChaos 2012-03-26 17:40:35
@CoreyOgburn我用matlab将图像读入矩阵X.它的大小是151 * 15 = 2265。然后我将矩阵X变换成1 * 2265的行向量,它是给定代码中的时间输入。 – shree 2012-03-26 17:41:44