在图像中存储加密消息的准确大小存在问题。
我想要做的是用AES密码加密一条消息,然后通过用消息字节替换像素的一个组件(红色、绿色或蓝色)来隐藏随机像素中的每个字节。
我已经这样做了,但我不能用同样大小的密文存储。
首先,我使用AES/CBC/PKCS5Padd使用Java密码扩展对消息进行密钥加密。
byte[] cipherText = encrypt(message, keyBytes);然后,我必须将cipherText转换为UTF-8字节数组,然后存储在图像中.如果没有,我以后就不能解密了。如果我没有正确地编码,我就不能在提取后解密它。这里的问题是messageBytes的大小> cipherText的大小。它比加密消息(即cipherText )占用更多的空间。示例:如果cipherText是32个字节,那么我得到148个字节的messageBytes。
但是我希望存储大小为cipherText的字节数组,并能够在以后提取它。
String encryptedMessage = Arrays.toString(cipherText);
byte[] messageBytes = encryptedMessage.getBytes(StandardCharsets.UTF_8);现在148个字节存储在图像中。然后,我将每个字节存储在随机像素的一个组件(r、g或b)中。
for(int i=0; i<messageBytes.length; i++) {
storeInsidePixel(image, messageBytes[i], secureRandom)
}在提取部分,我检索回messageBytes并转换为encryptedMessage以获得隐藏的cipherText。
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]));
}然后我用同样的密码和密钥解密了它。
String output = decrypt(cipherText, keyBytes);我希望存储大小为cipherText的字节数组,并能够以相同的大小提取它并在稍后对其进行解密。
如果我不编码到utf-8并存储它,我就不会得到相同的输出,因为如果存储在图像中的cipherText是1040字节,然后提取它,我将得到相同的字节值,但是字节数组的大小只有205个字节,解密失败。
是否有任何方法在图像中准确地存储1040字节的cipherText,并提取相同的1040字节的cipherText并能够对其进行解密?有办法弄成这样吗?
发布于 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字节,这可能是一个足够小的大小增加,您可以处理。
https://stackoverflow.com/questions/70494349
复制相似问题