gpt4 book ai didi

java - 为什么 AES/CTR/NoPadding 坏了?

转载 作者:太空狗 更新时间:2023-10-29 12:58:22 26 4
gpt4 key购买 nike

为简单起见,我现在使用硬编码 key 和 IV。AesWriter(下)将原始明文Abc\t1234\t\t\t\t\n加密写入文件11,87,-74,122,-127,48 ,-118,39,82,-83,68,-30,-84。但是 AesReader(也在下方)将文件内容解密为 zW?D?4?rc?~???~?_=p?J。我哪里出错了?

public class AesWriter extends Activity {
...
private void writeConfig() {
...
try {
Cipher cipher = Cipher.getInstance(AesReader.AES_ALGORITHM,
AesReader.PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, AesReader.getSecretKeySpec(),
AesReader.getIvParameterSpec());
byte[] encrypted = cipher.doFinal(config.getBytes());
OutputStreamWriter out =
new OutputStreamWriter(openFileOutput(fileName, 0));
out.write(AesReader.asHex(encrypted));
out.close();
...

public class AesReader extends Activity {
public static final String AES_ALGORITHM = "AES/CTR/NoPadding";
public static final String PROVIDER = "BC";
private static final byte[] aesKey128 = { // Hard coded for now
78, -90, 42, 70, -5, 20, -114, 103,
-99, -25, 76, 95, -85, 94, 57, 54};
private static final byte[] ivBytes = { // Hard coded for now
-85, -67, -5, 88, 28, 49, 49, 85,
114, 83, -40, 119, -65, 91, 76, 108};
private static final SecretKeySpec secretKeySpec =
new SecretKeySpec(aesKey128, "AES");
private static final IvParameterSpec ivSpec =
new IvParameterSpec(ivBytes);
...
private void readConfig() {
String fileName = configuration.getFileName();
try {
InputStream is = openFileInput(fileName);
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
CipherInputStream cis = new CipherInputStream(is, cipher);
InputStreamReader isr = new InputStreamReader(cis);
BufferedReader reader = new BufferedReader(isr);
String s;
while ((s = reader.readLine()) != null) {
configuration.modify(s);
}
is.close();
...
public static SecretKeySpec getSecretKeySpec() {
return secretKeySpec;
}
public static IvParameterSpec getIvParameterSpec() {
return ivSpec;
}
public static String asHex(byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10) {
strbuf.append("0");
}
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}

return strbuf.toString();
}

基于 erickson 建议的工作代码:

public class FileIO {
public final static String EOL = "\n";
public static final String AES_ALGORITHM = "AES/CTR/NoPadding";
public static final String PROVIDER = "BC";
private static final byte[] AES_KEY_128 = { // Hard coded for now
78, -90, 42, 70, -5, 20, -114, 103,
-99, -25, 76, 95, -85, 94, 57, 54};
private static final byte[] IV = { // Hard coded for now
-85, -67, -5, 88, 28, 49, 49, 85,
114, 83, -40, 119, -65, 91, 76, 108};
private static final SecretKeySpec secretKeySpec =
new SecretKeySpec(AES_KEY_128, "AES");
private static final IvParameterSpec ivSpec =
new IvParameterSpec(IV);

public String readAesFile(Context c, String fileName) {
StringBuilder stringBuilder = new StringBuilder();
try {
InputStream is = c.openFileInput(fileName);
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
CipherInputStream cis = new CipherInputStream(is, cipher);
InputStreamReader isr = new InputStreamReader(cis);
BufferedReader reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append(EOL);
}
is.close();
} catch (java.io.FileNotFoundException e) {
// OK, file probably not created yet
Log.i(this.getClass().toString(), e.getMessage(), e);
} catch (Exception e) {
Log.e(this.getClass().toString(), e.getMessage(), e);
}
return stringBuilder.toString();
}

public void writeAesFile(Context c, String fileName, String theFile) {
try {
Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
byte[] encrypted = cipher.doFinal(theFile.getBytes());
OutputStream os = c.openFileOutput(fileName, 0);
os.write(encrypted);
os.flush();
os.close();
} catch (Exception e) {
Log.e(this.getClass().toString(), e.getMessage(), e);
}
}
}

最佳答案

没有显示完整的代码,但看起来您正在将十六进制编码的文本写入文件,但在没有解码回字节的情况下读取它。跳过十六进制编码(我假设那是为了帮助您调试)。

关于java - 为什么 AES/CTR/NoPadding 坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3679625/

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