Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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 仅加密图像文件的内容,而不是整个文件_Java_Android_Security_Encryption_Bit Manipulation - Fatal编程技术网

Java 仅加密图像文件的内容,而不是整个文件

Java 仅加密图像文件的内容,而不是整个文件,java,android,security,encryption,bit-manipulation,Java,Android,Security,Encryption,Bit Manipulation,我正在创建一个应用程序,只需要写一个图像的内容。我需要的是,该文件仍然是一个转换后的图像,但图像显示不显示为原始 例如,我将加密的图像发送给其他用户,这个用户将能够显示和图像(但不是原始图像),但原始图像在该文件中加密 使用下面的算法,我对整个文件进行了加密,由于头文件也进行了加密,所以无法将其作为图像打开 我正在使用此算法,但我不知道如何仅加密数据或如何在java/android中添加/修改图像的标题: public byte[] encrypt_image(Bitmap bm, String

我正在创建一个应用程序,只需要写一个图像的内容。我需要的是,该文件仍然是一个转换后的图像,但图像显示不显示为原始

例如,我将加密的图像发送给其他用户,这个用户将能够显示和图像(但不是原始图像),但原始图像在该文件中加密

使用下面的算法,我对整个文件进行了加密,由于头文件也进行了加密,所以无法将其作为图像打开

我正在使用此算法,但我不知道如何仅加密数据或如何在java/android中添加/修改图像的标题:

public byte[] encrypt_image(Bitmap bm, String password_) {

    byte[] encryptedData = null;

    try{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] b = baos.toByteArray();  

        byte[] keyStart = password_.getBytes();
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
        sr.setSeed(keyStart);
        kgen.init(128, sr); 
        SecretKey skey = kgen.generateKey();
        byte[] key = skey.getEncoded();    

        // Encrypt
        encryptedData = Security.encrypt(key,b);


    }catch (Exception e) {
        Log.e("encrpyt_image()", e.getMessage());
    }
    return encryptedData;
}

任何人都知道如何编码,我一直在互联网上搜索,但没有成功。

我想get/setPixels方法可能是最简单的方法

int[] pixels = new int[bm.getWidth() * bm.getHeight()];
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight()); 
encryptIntArray(pixels);
bm.setPixels(pixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight());
现在只需编写encryptIntArray方法

编辑: 您也可以尝试使用ByteBuffer,这样就不必进行转换

ByteBuffer bb = ByteBuffer.allocate(bm.getByteCount());
bm.copyPixelsToBuffer(bb);
byte[] b = bb.array();
bm.copyPixelsFromBuffer(ByteBuffer.wrap(Security.encrypt(key,b)));

不过,我还没有测试该代码。

我想get/setPixels方法可能是最简单的方法

int[] pixels = new int[bm.getWidth() * bm.getHeight()];
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight()); 
encryptIntArray(pixels);
bm.setPixels(pixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight());
现在只需编写encryptIntArray方法

编辑: 您也可以尝试使用ByteBuffer,这样就不必进行转换

ByteBuffer bb = ByteBuffer.allocate(bm.getByteCount());
bm.copyPixelsToBuffer(bb);
byte[] b = bb.array();
bm.copyPixelsFromBuffer(ByteBuffer.wrap(Security.encrypt(key,b)));

我还没有测试过那段代码。

我不得不承认,我不理解这个问题。您想将一个图像加密到另一个图像中(显然有更多或更少的白噪声内容?),还是想在现有图像文件中隐藏一个额外的图像?我想加密一个图像,如果您在图像查看器上打开,您将消除噪声。通过我的编码,我加密了整个文件,因此图像查看器无法打开文件(.png,.jpeg…),因为头信息也被加密了。如果只是噪声,那么能够打开文件有什么意义?看看文档。使用copyPixelsToBuffer和CopyPixelsFromBuffer这可能很愚蠢,也不值得费心,因为SSL更简单,或者如果你真的使用AES这样的话,关键就在代码中,你并没有真正以有意义的方式保护任何东西。我不得不承认,我不理解这个问题。您想将一个图像加密到另一个图像中(显然有更多或更少的白噪声内容?),还是想在现有图像文件中隐藏一个额外的图像?我想加密一个图像,如果您在图像查看器上打开,您将消除噪声。通过我的编码,我加密了整个文件,因此图像查看器无法打开文件(.png,.jpeg…),因为头信息也被加密了。如果只是噪声,那么能够打开文件有什么意义?看看文档。使用copyPixelsToBuffer和CopyPixelsFromBuffer这可能很愚蠢,也不值得费心,因为SSL更容易使用,或者如果您确实这样使用AES,则密钥在代码中,而且你并没有以一种有意义的方式保护任何东西。请注意,将图像保存为JPG或任何其他改变图片的格式将破坏这种加密。此外,“加密”图像将完全不可压缩(嗯,可能是0.5%)。您是否有一些关于如何将int[]转换为byte[]的示例,我的算法返回byte[],并且我尝试的所有转换方法都不起作用:(很好,效果很好。我真的很感激;)请注意,将图像保存为JPG或任何其他更改图片的格式将破坏这种加密。此外,“加密”图像将完全不可压缩(嗯,可能是0.5%)。您是否有一些关于如何将int[]转换为byte[]的示例,我的算法返回byte[],并且我尝试的所有转换方法都不起作用:(太好了,效果很好。我真的很感激;)