gpt4 book ai didi

java - 文件在python中加密在android中解密

转载 作者:行者123 更新时间:2023-11-30 02:02:23 28 4
gpt4 key购买 nike

我一直在尝试解密 android 中的一个文件,该文件是从 python 加密的,这是我在解密时使用的 python 代码。

import os, random, struct
from Crypto.Cipher import AES
import sys
import hashlib

print("trying")

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
""" Encrypts a file using AES (CBC mode) with the
given key.

key:
The encryption key - a string that must be
either 16, 24 or 32 bytes long. Longer keys
are more secure.

in_filename:
Name of the input file

out_filename:
If None, '<in_filename>.enc' will be used.

chunksize:
Sets the size of the chunk which the function
uses to read and encrypt the file. Larger chunk
sizes can be faster for some files and machines.
chunksize must be divisible by 16.
"""
if not out_filename:
out_filename = in_filename + '.mjt'

iv = 16 * '\x00'
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)

with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
# outfile.write(iv)
outfile.write(bytes(iv, 'UTF-8'))

while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - len(chunk) % 16)

outfile.write(encryptor.encrypt(chunk))
# outfile.write(bytes(encryptor.encrypt(chunk), 'UTF-8'))


def main():
filename1 = sys.argv[-2]
filename2 = sys.argv[-1]
key = '0123456789abcdef'
encrypt_file(key, filename1, filename2)
print("done")


if __name__ == '__main__':
main()

这里是我的 android 函数试图解密

private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

public static void decrypt(String inputFile, String outputFile, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
FileInputStream fis = new FileInputStream(inputFile);

FileOutputStream fos = new FileOutputStream(outputFile);

IvParameterSpec iv = new IvParameterSpec(ivBytes);
SecretKeySpec sks = new SecretKeySpec(password.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
CipherInputStream cis = new CipherInputStream(fis, cipher);

int b;
byte[] d = new byte[1024];
while((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
fos.flush();
fos.close();
cis.close();
}

这在使用 AES/CBC/NoPadding 时给出java.io.IOException:数据 block 大小未对齐当使用 AES/CBC/PKCS5Padding 时,它给出java.io.IOException:解密中的最后一个 block 不完整

最佳答案

AES 是一种 block 密码,因此在加密和解密时都需要将消息填充到 block 大小的倍数。您的加密没问题。它读取文件大小,写入文件的前 8 个字节,然后写入 16 个字节 IV,最后逐 block 写入文件内容,以确保填充。但是,您的解密不遵循相同的解密模式。 AES 是一种 128 位 block 密码,因此您不必太担心指定 PKCS5Padding,只需按照与加密相反的相同例程进行操作即可。您的代码中也存在与 iv 相关的错误。

尝试以下操作,它应该会起作用:

private static byte[] filesize = new byte[8];
private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

public static void decrypt(String inputFile, String outputFile, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
FileInputStream fis = new FileInputStream(inputFile);
FileOutputStream fos = new FileOutputStream(outputFile);
fis.read(filesize, 0, 8);
System.out.println(new String(filesize));
fis.mark(9);
fis.read(ivBytes, 0, 16);
System.out.println(new String(ivBytes));
fis.mark(25);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
SecretKeySpec sks = new SecretKeySpec(password.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, sks, iv);
File file = new File(inputFile);
int byteLength = (int) file.length() - 24;
System.out.println(Integer.toString(byteLength));
byte[] bytes = new byte[byteLength];
byteLength = fis.read(bytes);
System.out.println(Integer.toString(byteLength));
System.out.println(new String(bytes));
InputStream bytesStream = new ByteArrayInputStream(bytes);
CipherInputStream cis = new CipherInputStream(bytesStream, cipher);

int b;
byte[] d = new byte[1024];
while((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
fos.flush();
fos.close();
cis.close();
}

关于java - 文件在python中加密在android中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com