首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在图像中隐藏cipherText精确大小的问题,然后提取出来,然后解密

在图像中隐藏cipherText精确大小的问题,然后提取出来,然后解密
EN

Stack Overflow用户
提问于 2021-12-27 10:33:56
回答 1查看 121关注 0票数 0

在图像中存储加密消息的准确大小存在问题。

我想要做的是用AES密码加密一条消息,然后通过用消息字节替换像素的一个组件(红色、绿色或蓝色)来隐藏随机像素中的每个字节。

我已经这样做了,但我不能用同样大小的密文存储。

首先,我使用AES/CBC/PKCS5Padd使用Java密码扩展对消息进行密钥加密。

代码语言:javascript
复制
byte[] cipherText = encrypt(message, keyBytes);

然后,我必须将cipherText转换为UTF-8字节数组,然后存储在图像中.如果没有,我以后就不能解密了。如果我没有正确地编码,我就不能在提取后解密它。这里的问题是messageBytes的大小> cipherText的大小。它比加密消息(即cipherText )占用更多的空间。示例:如果cipherText是32个字节,那么我得到148个字节的messageBytes。

但是我希望存储大小为cipherText的字节数组,并能够在以后提取它。

代码语言:javascript
复制
String encryptedMessage = Arrays.toString(cipherText);
byte[] messageBytes = encryptedMessage.getBytes(StandardCharsets.UTF_8);

现在148个字节存储在图像中。然后,我将每个字节存储在随机像素的一个组件(r、g或b)中。

代码语言:javascript
复制
for(int i=0; i<messageBytes.length; i++) {
    storeInsidePixel(image, messageBytes[i], secureRandom)
}

在提取部分,我检索回messageBytes并转换为encryptedMessage以获得隐藏的cipherText。

代码语言:javascript
复制
String encryptedMessage = new String(byteArray, StandardCharsets.UTF_8);
String newString = encryptedMessage.substring(1, encryptedMessage.length()-1);
String[] stringArray = newString.split(", ");

byte[] cipherText = new byte[stringArray.length];
for(int i=0; i<stringArray.length; i++) {
    cipherText[i] = (byte) (Integer.parseInt(stringArray[i]));
}

然后我用同样的密码和密钥解密了它。

代码语言:javascript
复制
String output = decrypt(cipherText, keyBytes);

我希望存储大小为cipherText的字节数组,并能够以相同的大小提取它并在稍后对其进行解密。

如果我不编码到utf-8并存储它,我就不会得到相同的输出,因为如果存储在图像中的cipherText是1040字节,然后提取它,我将得到相同的字节值,但是字节数组的大小只有205个字节,解密失败。

是否有任何方法在图像中准确地存储1040字节的cipherText,并提取相同的1040字节的cipherText并能够对其进行解密?有办法弄成这样吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-27 11:15:14

之后,我不得不将cipherText转换成UTF-8字节数组,然后存储在图像中。如果没有,我以后就不能解密了。如果我没有正确地编码,我就不能在提取后解密它。

不,这就是你出错的地方。您的cipherText应该已经是二进制的(如byte[] cipherText = encrypt(message, keyBytes);所示),图像格式也是二进制的。所以你不用再对它进行编码了。直接使用cipherText即可。

这里的问题是messageBytes的大小> cipherText的大小。它比加密消息(即cipherText )占用更多的空间。示例:如果cipherText是32个字节,那么我得到148个字节的messageBytes。..。字符串encryptedMessage = Arrays.toString(cipherText);

是啊,嗯,呃。如果您执行Arrays.toString,那么您将得到数组的文本表示,包括分隔符和诸如此类的内容,所有这些都可以不使用。

如果我不编码到utf-8并存储它,我就不会得到相同的输出,因为如果存储在图像中的cipherText是1040字节,然后提取它,我将得到相同的字节值,但是字节数组的大小只是205个字节,解密失败。

我们无法理解为什么您在这里得到一个较小的值,但是这是需要解决的问题--它不应该通过编码/解码来解决。可以随意发布一个minimal reproducible example的后续问题。

是否有将1040字节的cipherText准确存储在图像中并提取相同的1040字节的cipherText并能够对其进行解密的方法?有办法弄成这样吗?

这里有两个问题:长度指示,->,您需要某种方式来表示密文的大小。此外,如果您对多条消息使用相同的密钥,那么您也需要存储IV。

用于检测大小:例如,如果密文不超过65536字节,可以在16位(short)长度指示器前加上前缀。或者,对于CBC,您可以使用它来计算块的数量,因为解填充将显示确切的大小。这会让你存储16倍大的密文。

使用2字节大小指示器和16字节IV,您的密文将增长18字节。由于您的密文已经比明文大16字节,这可能是一个足够小的大小增加,您可以处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70494349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档