Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android中的rc4图像加密_Java_Android_Encryption_Client Server - Fatal编程技术网

Java android中的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算法,它在加密和解密文本方面非常有效,当我尝试加密/解密图像时,问题就出现了。我的输出图像总是无法读取。没有抛出异常。我不确定是加密还是解密不起作用,或者两者兼而有之。谢谢你的帮助

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]);