Java android中的rc4图像加密
我自己实现了rc4算法,它在加密和解密文本方面非常有效,当我尝试加密/解密图像时,问题就出现了。我的输出图像总是无法读取。没有抛出异常。我不确定是加密还是解密不起作用,或者两者兼而有之。谢谢你的帮助Java android中的rc4图像加密,java,android,encryption,client-server,Java,Android,Encryption,Client Server,我自己实现了rc4算法,它在加密和解密文本方面非常有效,当我尝试加密/解密图像时,问题就出现了。我的输出图像总是无法读取。没有抛出异常。我不确定是加密还是解密不起作用,或者两者兼而有之。谢谢你的帮助 RC4 Class 公共类RC4{ private byte[] S = new byte[256]; public RC4 (byte[] key) { byte[] T = new byte[256]; int keylen, j; byte t; f
RC4 Class
公共类RC4{
private byte[] S = new byte[256];
public RC4 (byte[] key) {
byte[] T = new byte[256];
int keylen, j;
byte t;
for (int i = 0; i < 256; i++) {
keylen = key.length;
S[i] = (byte) i;
T[i] = key[i % keylen];
}
//KSA - key-scheduling algorithm is used to initialize the permutation in the array "S"
j = 0;
for (int i = 0 ; i < 256 ; i++)
{
j = ((j + S[i] + T[i]) % 256) & 0xFF;
//swap
t = S[i];
S[i] = S[j];
S[j] = t;
}
}
public byte[] encrypt(byte[] plaintext)
{
int j = 0, i = 0, t, k;
byte temp;
byte[] pt,ct, s;
//deep copy
s = S.clone();
pt = plaintext;
ct = new byte[pt.length];
for (int jj = 0 ; jj < pt.length; jj++)
{
i = ((i + 1) % 256) & 0xFF;
j = ((j + s[i]) % 256) & 0xFF;
//classic swap
temp = s[jj];
s[jj] = s[j];
s[j] = temp;
t = ((s[i] + s[j]) % 256) & 0xFF;
k = s[t];
ct[jj] = (byte) (k ^ pt[jj]);
}
return ct;
}
public byte[] decrypt(byte[] ciphertext)
{
return encrypt(ciphertext);
}
客户端
FileOutputStream fos = null;
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
byte[] b = (byte[])objectInputStream.readObject();
RC4 rc4 = new RC4(sharedSecret);
byte[] decrypted = rc4.decrypt(b);
Bitmap bmp = BitmapFactory.decodeByteArray(decrypted, 0, decrypted.length);
fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
我发现了我的错误,它是在加密函数中;误用了计数器。下面是更正的代码
for (int counter = 0 ; counter < pt.length; counter++)
{
i = ((i + 1) % 256) & 0xFF;
j = ((j + s[i]) % 256) & 0xFF;
//classic swap
temp = s[j];
s[j] = s[i];
s[i] = temp;
t = ((s[i] + s[j]) % 256) & 0xFF;
k = s[t];
ct[counter] = (byte) (k ^ pt[counter]);
for(int计数器=0;计数器
首先,注释掉所有RC4加密/解密代码,然后在剩余代码中运行一个位图文件,查看错误是否在RC4编码/解码之外。如果是RC4,则对输入和输出文件进行逐字节比较,以尝试找到错误。通过电子签名不起作用。您可能不应该使用自制RC4-执行不当会产生后果(如损坏的WEP/TLS所示)-连接级别上的密码类或TLS/SSL有什么问题?就目前情况而言,为什么所有位图都有问题?如果您想在selectedImagePath上加密文件,那么只需将其加载到字节数组并加密,另一端解密并直接写回磁盘。我知道这些类,但这是我自己编写的要求如果。让我试试那个解决方案,thanx。我按照你的建议做了Alex,但不幸的是我的问题没有解决。
for (int counter = 0 ; counter < pt.length; counter++)
{
i = ((i + 1) % 256) & 0xFF;
j = ((j + s[i]) % 256) & 0xFF;
//classic swap
temp = s[j];
s[j] = s[i];
s[i] = temp;
t = ((s[i] + s[j]) % 256) & 0xFF;
k = s[t];
ct[counter] = (byte) (k ^ pt[counter]);