java - Base64 解码无法与 Android 中的 Cipher.Decrypt 一起正常工作

标签 java php android base64

这是一个字符串:

String msg="dpbqNszFN2cpmtlzPi3myV9M1ctlkSIQD95ue+T+9rz13T+Pe/aLZ8Pd5geI+PhEM/b0UeRS1cAzKybQsKICTBhh3ke5Jjw6BHWGESJWBnUT54lAlTvzkgOxpQ5stBh2cPPSn3KLyKmXifr8ClbV5s1k3Gy5C7HitA5KLw7hRxAmIGSWQG7PaiLNEVRbgicNfJ7Ic7VIdGA/UA51vK8mpywIR2YQUDPv30ThGq4DuclaJ3X4aVWVj8VYChcfM+82sViVU8HO3DF9CCU4EIADNET503olxiDZBp7WMYmJvWq0KhhZXkLSY3QFmcSMX6IThtdKKCcZp6hu3TtC+7aP7Q==";

所以字节数组是

[1] => 100     [2] => 112     [3] => 98     [4] => 113     [5] => 78     [6] => 115     [7] => 122 ..

哪个应该解码为

[我使用 PHP base64_encode() 编码为上述形式,并使用 base64_decode() 获取此输出]

[1] => 118     [2] => 150     [3] => 234     [4] => 54     [5] => 204     [6] => 197      7] => 55     ...

但我面临的问题是(在 android 中,使用 Base64.decode(String) )它被解码为:

[118, -106, -22, 54, -52, -59, 55, 103, 41, -102, -39, 115, 62, 45, -26, -55, 95, 76, -43, -53, 101, -111, 34, 16, 15, -34, 110, 123, -28, -2, -10, -68, -11, -35, 63, -113, 123, -10, -117, 103, -61, -35, -26, 7, -120, -8, -8, 68, 51, -10, -12, 81, -28, 82, -43, -64, 51, 43, 38, -48, -80, -94, 2, 76, 24, 97, -34, 71, -71, 38, 60, 58, 4, 117, -122, 17, 34, 86, 6, 117, 19, -25, -119, 64, -107, 59, -13, -110, 3, -79, -91, 14, 108, -76, 24, 118, 112, -13, -46, -97, 114, -117, -56, -87, -105, -119, -6, -4, 10, 86, -43, -26, -51, 100, -36, 108, -71, 11, -79, -30, -76, 14, 74, 47, 14, -31, 71, 16, 38, 32, 100, -106, 64, 110, -49, 106, 34, -51, 17, 84, 91, -126, 39, 13, 124, -98, -56, 115, -75, 72, 116, 96, 63, 80, 14, 117, -68, -81, 38, -89, 44, 8, 71, 102, 16, 80, 51, -17, -33, 68, -31, 26, -82, 3, -71, -55, 90, 39, 117, -8, 105, 85, -107, -113, -59, 88, 10, 23, 31, 51, -17, 54, -79, 88, -107, 83, -63, -50, -36, 49, 125, 8, 37, 56, 16, -128, 3, 52, 68, -7, -45, 122, 37, -58, 32, -39, 6, -98, -42, 49, -119, -119, -67, 106, -76, 42, 24, 89, 94, 66, -46, 99, 116, 5, -103, -60, -116, 95, -94, 19, -122, -41, 74, 40, 39, 25, -89, -88, 110, -35, 59, 66, -5, -74, -113, -19]

正如您所看到的,某些字符(虽然不可读)没有被正确解码。 编辑(2):字节在 java 中是有符号的,而在 PHP 中是无符号的。感谢@Jon 和@Tony 澄清了这个想法。但该错误仍然存​​在于我的代码中。

编辑(1):

代码段:

KeyFactory fact = KeyFactory.getInstance("RSA");
BigInteger e=new BigInteger("65537");
BigInteger n=new BigInteger("B7AC0C8F738305F8BDDF93EE25655A70FBDF9F074640C159E36914C227BE1E50A615A25E6706EBA08FB79216F02279420ED4C9DA310778601F6A3233EDADE2FF3775D29E5302C4FCB9E7879D9F3C814AE8F42759148D91CDB23E528241AE2E44F6DE9D4334494C103886B2333D5833EFEABD76205B8F4897BB908E71697A10F6494EBFB0392A831575F64672E0F915A88F46F7FC03E7F94EB56A8A3296840095CB53787EE6E71D4C297108EA5CDD31BD37B1C0A55A8B5FA78F88FC82AEF3C2C80C0FC2CC97A1AEC74ACE44F4AC1B111B727311DA4D1447899A15BA292BCA4E7E864DF55CCB903CD4109874AD475393E7F24FC60E2D7B88E9B4FB57FA54A9B817",16);
RSAPublicKeySpec keySpec=new RSAPublicKeySpec(n,e);
PublicKey pubKey = (PublicKey) fact.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, pubKey );
String msg="dpbqNszFN2cpmtlzPi3myV9M1ctlkSIQD95ue+T+9rz13T+Pe/aLZ8Pd5geI+PhEM/b0UeRS1cAzKybQsKICTBhh3ke5Jjw6BHWGESJWBnUT54lAlTvzkgOxpQ5stBh2cPPSn3KLyKmXifr8ClbV5s1k3Gy5C7HitA5KLw7hRxAmIGSWQG7PaiLNEVRbgicNfJ7Ic7VIdGA/UA51vK8mpywIR2YQUDPv30ThGq4DuclaJ3X4aVWVj8VYChcfM+82sViVU8HO3DF9CCU4EIADNET503olxiDZBp7WMYmJvWq0KhhZXkLSY3QFmcSMX6IThtdKKCcZp6hu3TtC+7aP7Q==";
byte[] bytes=msg.getBytes("UTF-8");
byte[] enc_bytes= Base64.decode(bytes,Base64.DEFAULT);
byte[]  dt = cipher.doFinal(enc_bytes);   
String code=new String(dt,"UTF-8");
System.out.println(code);

密码解密的字符串显示为(在第二个 system.out 处)

05-10 21:05:27.501: I/System.out(11809): �ќ2`��H&��'Va�x�m��0G�����V�T�����)^����/|���BG,f_r    fK�B7?�a��n������Jl�y�yL���}��΂Ճ������JZj�+�|�-#ș%u�1�z�c�G��nl�5����HELLO HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 H

Base64_编码和签名数据为“HELLO HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 HI1 H”


[已解决]

非常感谢@JonSkeet。

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");删除了所有前缀的垃圾数据。

最佳答案

在我看来一切都很好 - 你只需要记住字节在 Java 中是有符号的。因此,Java 中的值 -106 对应于无符号值 150。一旦您记住这一点,我想您会发现 PHP 中的所有值都对应于 Java 中的值。

请注意,您应该区分字节字符。所以当你说:

As you can see , some characters ( which are not readable though) , are not getting decoded correctly.

实际上指的是一些字节...并且不存在“可读”字节这样的概念。

编辑:我没有看到任何迹象表明您实际上解密了数据。

您正在使用平台默认编码将 Base64 解码的仍然加密结果转换为文本:

String tmpr=new String(baser);

您不应该这样做 - 您应该使用 baser 作为要解密的密文。

根本不清楚您传递给 doFinaltmp 值来自哪里......

关于java - Base64 解码无法与 Android 中的 Cipher.Decrypt 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537263/

相关文章:

java - 如何使用 Java 在 SPARK 中使用映射函数

java - 任何人都可以在 mac os 10.5.8 上运行 eclipse galileo

php - CakePHP (2.4) 深层关系

php - 从漂亮的网址获取变量

android - 日志的相当奇怪的行为

android Intent 不适用于wifi、声音、蓝牙?

java - JTable:如何通过弹出输入对话框使用自定义编辑器更新单元格?

java - 在 Recycler View 中实现无限滚动

php - 如果数据库连接在配置文件中,PDO 准备语句将停止重定向

android - Flutter async/await 在 forEach 中不起作用