- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为简单起见,我现在使用硬编码 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/
我使用node.js加密文件并在JAVA中解密。解密是使用“AES/GCM/Nopadding”算法在 JAVA 中完成的,它是第三方应用程序,因此我无法更改 JAVA 代码。我使用“aes-256-
Java 的 Cipher 类支持转换 listed there 。其中有几个 NoPadding 变体: AES/CBC/NoPadding (128) AES/ECB/NoPadding (128
我遵循了几个示例,并在尝试实现此处引用的 AES/GCM/NoPadding 时:https://www.strongauth.com/samplecode/GCM.java我无法加密任何包含特殊字符
我正在尝试解密使用 CryptoJS 加密的 java 文本。我在其他帖子中读到它们使用不同的默认模式和填充,因此我将它们(java/cryptojs)都设置为使用 aes/cbc/nopadding
我写了一个类,用于对任意数据进行解密和加密。 它是这样工作的:因为 AndroidKeyStore 生成的 AES key 在卸载应用程序后“丢失”,我们有一个公钥/私钥对,其中公钥包含在应用程序中。
我正在尝试用 Java 和 PHP 加密和解密 Strings,所以我使用 AES/CFB8/NoPadding,这对双方都有效。 现在我的 Cryptor 可以很好地处理拉丁字符,只要我将字符集设置
关于我的实现的信息 下面的代码片段突出显示了我当前使用 AES 密码和 CTR 操作模式实现的加密对象。 import javax.crypto.Cipher; public abstract cla
我们正在尝试在 java 7 中进行支持 AES/GCM/NoPadding 的加密,但出现异常。 找不到任何支持 AES/GCM/NoPadding 的提供商 生成密码实例的代码示例如下。 Secr
哪里可以找到不使用“NoPadding”的 RSA 加密示例? --更新 更好:如何使此 SSCCE 正确运行而不抛出“RSA block 数据过多”异常? import java.math.BigI
当我在 Android Marshmallow(Android 6.0.1) 上使用此代码时,解密正常,但当我在 Android Oreo(Android 8) 设备上运行时,解密值不同且数据不正确。
我是黑莓开发新手,需要使用 AES/ECB/NoPadding 完成加密和解密任务。我使用了下面的代码,来自互联网。 加密方式: public static byte[] encrypt( byte[
使用以下代码,我正在执行 AES 加密操作,我在不同的实例中传递相同的输入,但我得到了不同的密码。为什么会出现这种情况? public static byte[] encrypt(byte[] pl
我认为我的问题需要一些我可能不具备的基本知识。 我正在解密这样的字节数组: var cipher = CipherUtilities.GetCipher("AES/CTR/NoPadding"); c
我已经实现了 AES/CBC/PKCS5Padding 并想在 Java 1.8 中继续使用 AES/GCM/NoPadding 但一直收到 javax. crypto.AEADBadTagExcep
我需要使 C# 应用程序与 Java 应用程序兼容。 Java 应用程序使用 Cipher.getInstance("RSA/ECB/nopadding"); 初始化程序生成密码 ECB 和无填充。
String plain1= "Test"; byte[] cipher = SplashSecure.getInstance().encrypt2(plain1); String plain2 =
尝试在 Marshmallow 上加密和解密一些数据。加密效果很好,但在尝试解密时,我收到 RuntimeException,提示“iv == null”。 基本上,cipher.getIV() 和
我的 AES 加密代码有问题。我只正确加密了前 16 个字符,其余字符不正确。 下面是我的代码。 import java.io.ByteArrayOutputStream; import java.i
Cipher cipher = Cipher.getInstance("AES256/CTR/NoPadding") 以上代码抛出如下异常: Stack trace: java.security.No
我正在尝试使用 AES/GCM/NoPadding 在 Java8 中进行加密。但我无法弄清楚为什么在解密时出现 AEADBadTagException。 这是我的代码: private final
我是一名优秀的程序员,十分优秀!