原始文本、Java运行解密和Android运行解密都(略有)不同
我正在尝试运行一个简单的加密/解密Android应用程序,并用Java对其进行测试。我已经搜索过了,但没有找到与我的问题相关的答案 本质上,加密和解密在大部分情况下都是有效的,除了Java和Android中解密后的文本与加密后的原始文本略有不同。例如,原始文本、Java运行解密和Android运行解密都(略有)不同,java,android,encryption,encoding,character-encoding,Java,Android,Encryption,Encoding,Character Encoding,我正在尝试运行一个简单的加密/解密Android应用程序,并用Java对其进行测试。我已经搜索过了,但没有找到与我的问题相关的答案 本质上,加密和解密在大部分情况下都是有效的,除了Java和Android中解密后的文本与加密后的原始文本略有不同。例如,进展如何?在Java中被解密为howsitgo=,在Android中被解密为howsitgoaaa 以下是Java代码: KeyStore ks = null; try { ks = KeyStore.getInstance(KeyStor
进展如何?
在Java中被解密为howsitgo=
,在Android中被解密为howsitgoaaa
以下是Java代码:
KeyStore ks = null;
try {
ks = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream is = new FileInputStream("./raw/./akeystore");
ks.load(is, "a".toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
Certificate cert = ks.getCertificate("akeypaircer");
RSAPublicKey publicKey = (RSAPublicKey)cert.getPublicKey();
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
c.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] decodedString = Base64.decodeBase64("how's it going?".getBytes("UTF-8"));
byte [] cipher = c.doFinal(decodedString);
RSAPrivateKey privateKey = (RSAPrivateKey)ks.getKey("akeypair","a".toCharArray());
c.init(Cipher.DECRYPT_MODE, privateKey);
byte [] decrypted_cipher = c.doFinal(cipher);
byte[] encodedBytes = Base64.encodeBase64(decrypted_cipher);
System.out.println(new String(encodedBytes, "UTF-8"));
我假设这与字符编码有关,但我对此一无所知
我还猜测,Java和Android之间可能存在差异,因为我必须使用两种不同的密钥库类型(BKS用于Android,JKS用于Java)。这显然是错误的:
Base64.decodeBase64("how's it going?".getBytes("UTF-8"))
“进展如何?”
不是base 64字符串,您无法对其进行base 64解码。如果您需要一个以字符串表示的密文,其思想是对密文进行base64编码。对于纯文本,需要将字符串转换为字节。但您已经通过将其编码为UTF-8实现了这一点
简言之:
- 您可以通过执行(例如,base 64、base 32、十六进制编码)从字节创建文本
- 您可以通过执行(例如ASCII、ISO 8859-1“拉丁”、UTF-8和UTF-16BE或LE)从文本创建字节
这显然是错误的:
Base64.decodeBase64("how's it going?".getBytes("UTF-8"))
“进展如何?”
不是base 64字符串,您无法对其进行base 64解码。如果您需要一个以字符串表示的密文,其思想是对密文进行base64编码。对于纯文本,需要将字符串转换为字节。但您已经通过将其编码为UTF-8实现了这一点
简言之:
- 您可以通过执行(例如,base 64、base 32、十六进制编码)从字节创建文本
- 您可以通过执行(例如ASCII、ISO 8859-1“拉丁”、UTF-8和UTF-16BE或LE)从文本创建字节
是的,就是这样。告诉过你我对字符编码一无所知。(编码也是我上一个问题的问题)。@EmbattledSwag我猜这里大约50%的加密问题与编码/解码有关,而不是加密/解密。所以你不是唯一一个在那里的人。也就是说,我猜大约80%——如果不是更高的话——也存在某种安全问题,比如忘记为密文添加完整性和真实性。它可能还存在一些问题,比如在ECB模式下使用RSA而不是使用对称AES密钥(提示,提示)的混合加密。是的,就是这样。告诉过你我对字符编码一无所知。(编码也是我上一个问题的问题)。@EmbattledSwag我猜这里大约50%的加密问题与编码/解码有关,而不是加密/解密。所以你不是唯一一个在那里的人。也就是说,我猜大约80%——如果不是更高的话——也存在某种安全问题,比如忘记为密文添加完整性和真实性。它还可能存在一些问题,例如在ECB模式下使用RSA而不是使用对称AES密钥(提示,提示)的混合加密。