Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原始文本、Java运行解密和Android运行解密都(略有)不同_Java_Android_Encryption_Encoding_Character Encoding - Fatal编程技术网

原始文本、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

我正在尝试运行一个简单的加密/解密Android应用程序,并用Java对其进行测试。我已经搜索过了,但没有找到与我的问题相关的答案

本质上,加密和解密在大部分情况下都是有效的,除了Java和Android中解密后的文本与加密后的原始文本略有不同。例如,
进展如何?
在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密钥(提示,提示)的混合加密。