【问题标题】:Identical code behaving differently from Android (kotlin) and AndroidTest与 Android (kotlin) 和 AndroidTest 行为不同的相同代码
【发布时间】:2021-02-27 13:23:21
【问题描述】:

我正在尝试从测试和常规 android 运行中运行以下代码, 以下代码正确运行并设法从测试运行,但返回与常规运行不同的值:

val privateKeyStr1 = "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDusw1gf0MRuwDgv/3fzfQ2ro01ZYIKcj0qLGjbqNJD60SYaEdoJWqpyVkUq24FOL6HQOqAqZirNmOiABWNDlWV3B3gP/piXRYyFSfIBSHURNuJ2Cc0yDYEK8v635lPUJN3F9n1DgDW5A719nyVPogqNxB4pBkmO+N50jdtBCXErfF64npcCW3QfNohc80FIeEH2E0FmLatYtkpR1roeITb3OIc61SKZn8Dx3O87q7NRg9/LJA7bBwQE8UBc1/PE1zjZzWChs5r4zwwvhBcRpm+SJ7WsG8Rz+/4aS0WmMNiu22bzYjyvT0Fm2axYmoN0Aw9X9lbLToGCT2F7y41U5YZAgMBAAECggEBAIY3I4RoyluD3MCC88sN0Q2WJEwr4WziQ0YdZnBsgp4yAYX4zH3g3BLP5kjbA6fn+imu9KyXsAJFOMx0Y6nGr5TuCdZ34t/AG6TZhF7Rk+35McBWS+U/1i+OOMm9RET2t5Q1UxaZYxtxbIAcsnxwhrvF7nsHOiTnc8ahzwx7Uok9dw9iuz9q/NBVQtL2ic38G5tCyNyvKHhK/vZDw0DKhAMDJ0c+iZs0iwf08UCMij3DFohgSjb6jAtnzD0Bg5NbUCGijL1qFbOoHrZcF8jfW2IOaJP0O5fIh6V673ewp5RH4gh0TbMOPYzTHgttWLRaADx2DZKYnH+B3jt16y9ebgECgYEA+q4xgH6aA0mLIQA94VOPVQgYDHxeqkAAL6hMsh4oGX3/AZ2GQPM24wNIMn8lm7wzmz2VkHgLUMMYrbT9boeCnaUzIkV14qHB1iCpk9RU7eC23oSHLguYON+5abOPUQMYMsOyIWt5wywaZLZBAeZXjbmwPzYr2MphVnD0LJe0KPkCgYEA88PF0Bkb6RuR0U3UR/KAIESfJDWjqfofhEzmFd6Z6fk8sE9WEJ53KaZEwIPz0kMfn63gEHujIbV3TqzcMxOGjWJWYJLe6H+aeEnjV38SVbKt87aDWM+c2tUIJr1crYrWm7nQv/856Z7r50XJv2XSoq190bBc0thEszvMu/gePiECgYEAgIZJCQlf62mMdKoMD/fol/8jXVtyqbVQox6V3AjMJG3ODcT27VwFexTWslUwMg2nI+PKSBzUKF8uyvjtqvq9RBhMBDk6vKyUljV+3DVUKfY5rBKkwD3fmOFTzdbrFu0QPg7JyIqzDhcRnSs4X0H7B8X5kB81EdyJVWlqN2a8TvkCgYEA1B961fnjpdiN7btyjSFjibDtY48h2tqD7pcUadeJzGdM/ogrds7PF3lOvtCUrlYnAMdIAk/0x3KoXdhizjehkQsP634jZ+MSwrZZlVxI0jZo1Xnvlqsj7fIP49ZI/eOhmWX7V/h7pubalijOxTWQNGwQ3xY/0GLOdcIGCVSCzMECgYEAzFzqTMG8ueWGDbBB6cWG4aJXfV2PHAdGqctuTFiLnzwm7MOHi/vHutFwgyPnjFI6CnfCMgYu2E+AsOG+8uu8bvCX7go8e2xUFbIyCnxpnrpltfoeJUDTAIgPTgMHaeJN05Aba1kHG6+xwx3cBp8sN3bhtHGQBURR8M2kzJIYKMc="
val cipherText = "TWN1xaX+rjcdQ2vgnbMdv/y7VPMj35qvHgm1U1HeYK6X1pTJCHq4PSLaJUtndZmIIUxWvaU/hKimX0MbFfgKM3JZYGV8jsNv3bp/7HBAfs1CPz7UqjrwRF3h8FiN7EUYEB9D89JMqVp9/WgOXOu/NLGhNNS3ESYAA8bFyXDgDBpJVzPX/Qilv/OIp7T/nGPO4lXIAFsQtpf5A8R8N/sSssB3urZLkm9zTc2fyWZMUH6AD08+/UYtVp41Tf3bp6qIZZvrtfo44HWgOmPBxx+WGq0PVUVMDkXsmoIPQtUFRObfwTS8r0+reBDKAVfJgtxZRGqXbmsAK9KA4MlAoe67lA=="
val kf = KeyFactory.getInstance("RSA")
val decoded = Base64.getDecoder().decode(privateKeyStr1)
val privateKey = kf.generatePrivate(PKCS8EncodedKeySpec(decoded))
val cipher: Cipher = Cipher.getInstance("RSA")
cipher.init(Cipher.DECRYPT_MODE, privateKey)
val plainText = String(cipher.doFinal(Base64.getDecoder().decode(cipherText)))
print(plainText)

从测试它返回: “你好”(如预期的那样)

从 android 返回: �5J�o����5ټ���s{���,A|R��2��guPЪ(t��g3��B�>�|O�����K��V����s���Sÿ�� �J)��>�d���x��g&�4C�(~F���f��f�7} �������������� ���� �o��D4����7 [�1h�*�nv4�P Ø ZE{`�你好

谢谢

【问题讨论】:

  • 看起来填充没有被删除。规范RSA 可能会退回到不同的默认值。尝试使用RSA/ECB/PKCS1PaddingRSA/NONE/PKCS1Padding 代替Cipher.getInstance(...) 中的RSA 的完整规范。
  • 我尝试这样做,但出现了某种错误:java.security.NoSuchAlgorithmException: RSA/NONE/PKCS1Padding KeyFactory not available and java.security.NoSuchAlgorithmException: RSA/ECB/PKCS1Padding KeyFactory not available任何想法为什么代码的行为不同于测试而不是测试?
  • 尝试更改 Ciphernot KeyFactory

标签: android kotlin encryption rsa


【解决方案1】:

解决方案是按如下方式初始化密码实例:

val cipher: Cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 2018-01-29
    • 1970-01-01
    • 2021-07-16
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多