我想在第一个字符中创建一个带有幻数的加密文件 如果我加密文件,一切都很顺利,但如果我先写下幻数,那么加密的部分就会缩短。
我使用.txt文件进行测试。
这是我的代码:
FileInputStream fis= new FileInputStream(file)
[...]
//Write magic number
fos.write("%AES".getBytes(),0,4);
byte[] ivbytes = new byte[]{(byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p'};
IvParameterSpec iv = new IvParameterSpec(ivbytes);
while(pwd.length()<16) {
pwd+="_";
}
SecretKeySpec sks = new SecretKeySpec(pwd.getBytes(), "AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, sks,iv);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
while((k = fis.read(d)) > 0)
{
cos.write(d, 0, k);
}
// Flush and close streams.
cos.flush();
cos.close();
fis.close();
[...]
这是十六进制内容missing byte
调试与4的偏移相同,但是当上次读取时,结果会被调整。
我尝试加密文件,然后使用带有幻数的第二个文件,后跟一个字节到字节的副本,但没有什么总是一样的。
用于调试我创建一个序列为“1234567890”的文本文件 我得到这两个十六进制 with and without magicNumber
一个返回正确的序列,另一个返回“0123456”
答案 0 :(得分:0)
问题是fis.read(d)
正在读取的数据缺少最后四个字节。
fis
在哪里创建以及如何创建?在k
循环中观看d
和while((k = fis.read(d)) > 0)
。问题不在于它正在读取正确的输入加密。