当前位置: 首页 > 面试题库 >

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

左丘涵畅
2023-03-14
问题内容

我正在创建一个APP,并且只需要刻印图像的内容。我需要文件转换后仍然是图像,但是显示的图像不会显示为原始图像。

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

使用以下算法,我加密了整个文件,由于标头也被加密,因此无法将其作为图像打开。

我正在使用此算法,但我不知道如何仅加密数据或如何在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());

现在,您只需要编写cryptoIntArray方法。

编辑:您也可以尝试使用ByteBuffer,则不必进行转换。

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

我还没有测试过该代码。



 类似资料:
  • 问题内容: 结合我的另一个问题,并在更改了这部分代码之后 从解密部分,我遇到了另一个错误,这是 当我单击SheepTest.png时,文件为空。错误在哪里?谁能帮助我解决错误?谢谢。 问题答案: 我猜想这行返回null: 文档说明: “如果没有注册的ImageReader声称能够读取结果流,则返回null。” 空值将传递给此调用,从而导致NPE: 我不熟悉此API,但是从文档和此处看到的内容中,我

  • 文件加密 案例描述 近些年来,因为信息泄露造成财产损失的事件时有发生。随着科技的发展,信息的传播与获取越来越方便,为了防止因信息泄露造成的各种危机,信息加密技术应得到充分的重视。本案例要求设计程序,对已经存在的文件进行加密和解密。 案例分析 文件加密的目的是保证信息的安全,加密的原理是根据某种原则,对源文件中的信息进行修改,使加密后的文件在与源文件仍保持联系的情况下,不会直接反映出源文件中存储的信

  • 问题内容: 我有一个奇怪的问题 我的解决方案基于将硬编码文件解密为字节[] 因此,我写了一个小的Cypher类来帮助进行加密/解密…它曾经用来模拟在某个地方进行硬编码的密钥,以及另一个在其他地方存储的预加密密钥。但这与atm无关。 加密过程如下: 检索硬编码的字节数组 用它来解密key2 使用key2解密数据 使用key1进一步解密数据 已解密数据 我将加密的数据存储为十六进制字符串,使用这两个函

  • 问题内容: 我正在尝试编写一个简单的程序来使用AES算法对文件进行加密和解密。我在加密方面没有问题,但是在解密方面.. 这是解密部分: } 现在的问题是解密部分是:使用填充密码解密时,输入长度必须是16的倍数 我知道我错误地保留了会话密钥和字节的错误丢失了。但是我该如何正确地做呢? 问题答案: 您的代码中有些混乱,可能是因为缺少了您调用的某些方法,或者可能是因为您使用的是密钥来加密…您的密钥(!!

  • 问题内容: 我有一个名为’filename.txt.pgp’的PGP文件,需要解密。当我从命令行运行解密时,它仅询问我密码。我使用gpg命令: 密码足够,我的文件已解密。我可以阅读它的内容。 现在,我应该用Java创建一个实用程序。经过研究,我发现Bouncy Castle图书馆是我最好的选择。但是我可以找到的所有Java示例都使用我没有的公共/专用密钥文件。 您能帮我举一个Java示例,该示例仅

  • 我不完全确定我该做什么了。我一直在网上到处乱翻东西,通读例子,但它们似乎都是如何加密一整个文件,或者只是加密一段数据,除了立即再次解密之外什么也不做。我该如何处理逐行书写?