0

我正在尝试在 Android 中实现非对称算法。我设法做到了这一切。但是我在输出时遇到了一个问题。

通过私钥解密后我得到的是(最后包含实际文本):

�������\�C���gz�{ܳkK��c��LB(7fz���H�8�� ��ȏ�ҍ�X    ��KI��aj�B��x�D�n>�ι�&
    UL-1���E�;��s9�zB[�9B�t��B�A�s�GA6����y�f���J�����+.
    `g4�s�1��p�PW�%��7�"��fQ����G���x� �|&�ѡ�gq������:X�be�_��av��{'msg':'Laravel 7.7777777'}

实际消息是:

{'msg':'Laravel 7.7777777'}

您可以清楚地看到它存在于解密的字符串中。我知道这是由于一些字符串或其他一些愚蠢的错误或类似的东西。但我无法得到那个。甚至我的加密数据在到达服务器时也有同样的问题。但是当我最终加密和解密时,它工作正常。它发生在交换密钥时。

在这里,我附上了负责非对称加密的实际课程。带有公钥和私钥。连同要解密的加密文本。

public class AsymmetricHandler {

    String ALGO_TYPE = "RSA";
    String CIPER_TYPE = "RSA";
//    String CIPER_TYPE = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";

    private static AsymmetricHandler instance = null;

    public static AsymmetricHandler getInstance() {
        if (instance == null) {
            Security.setProperty("crypto.policy", "unlimited");
            instance = new AsymmetricHandler();
        }
        return instance;
    }


    public PublicKey getActualPublicKey(String base64EncryptedStringKey) throws Exception {
        KeyFactory kf = KeyFactory.getInstance(ALGO_TYPE);
        X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.decode(base64EncryptedStringKey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", ""), Base64.DEFAULT));

        return kf.generatePublic(keySpecX509);
    }

    public PrivateKey getActualPrivateKey(String base64EncryptedStringKey) throws Exception {
        KeyFactory kf = KeyFactory.getInstance(ALGO_TYPE);
        PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(base64EncryptedStringKey.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", ""), Base64.DEFAULT));

        return kf.generatePrivate(keySpecPKCS8);
    }

    public String decodeBase64String(String value) {
        return new String(Base64.decode(value, Base64.DEFAULT));
    }

    public String encodeToBase64String(String value) {
        return new String(Base64.encode(value.getBytes(), Base64.DEFAULT));
    }


    // Get RSA keys. Uses key size of 2048.
    public Map<String, Object> getRSAKeys() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGO_TYPE);
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();

        Map<String, Object> keys = new HashMap<String, Object>();
        keys.put("private", privateKey);
        keys.put("public", publicKey);
        return keys;
    }


    public String encryptString(String msg, PublicKey key)
            throws NoSuchAlgorithmException, NoSuchPaddingException,
            IllegalBlockSizeException,
            BadPaddingException, InvalidKeyException {

//        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
        Cipher cipher = Cipher.getInstance(CIPER_TYPE);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return Base64.encodeToString(cipher.doFinal(msg.getBytes(StandardCharsets.UTF_8)), Base64.DEFAULT);
    }

    public String decryptString(String msg, PrivateKey key)
            throws InvalidKeyException,
            IllegalBlockSizeException, BadPaddingException {

        try {
//            Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
            Cipher cipher = Cipher.getInstance(CIPER_TYPE);
            cipher.init(Cipher.DECRYPT_MODE, key);
            return new String(cipher.doFinal(Base64.decode(msg, Base64.DEFAULT)), StandardCharsets.UTF_8);


        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            e.printStackTrace();
        }

        return null;
    }

}

这是我正在使用的示例键和值。

 String stringPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApSNOjR5QWU4H24OAhPHaJwq7/9Nqzcfiiau4o51+yopr9RG2ZDjpoeP/DEL/Frnz+PRrcdwiZxtk00qVqz15Y/eOc3VsOGHYbPYI6Q27n4L/t1PRHw/9AWjWHomxNvSpxkgg3ABFUdfYVoPDYqbm9Vu1m50sHzqEGBX9xIdgYjlWrjsKmQD5ciejE+eYOJnXJPKG9oXZJGmiQRgvlaPYL6oj+jfbv5/+FHVgWRqXRXURLSxa85qPVS673hmi6ApqUCnWWNhuZ66S1SypvHnCFQuqLIDILGwMkRvm+SOXJKrtpRdENuQMfdBZjeILYHAgILYgTcCnmnhii35BMJ6kEQIDAQAB";

String stringPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClI06NHlBZTgfbg4CE8donCrv/02rNx+KJq7ijnX7Kimv1EbZkOOmh4/8MQv8WufP49Gtx3CJnG2TTSpWrPXlj945zdWw4Ydhs9gjpDbufgv+3U9EfD/0BaNYeibE29KnGSCDcAEVR19hWg8Nipub1W7WbnSwfOoQYFf3Eh2BiOVauOwqZAPlyJ6MT55g4mdck8ob2hdkkaaJBGC+Vo9gvqiP6N9u/n/4UdWBZGpdFdREtLFrzmo9VLrveGaLoCmpQKdZY2G5nrpLVLKm8ecIVC6osgMgsbAyRG+b5I5ckqu2lF0Q25Ax90FmN4gtgcCAgtiBNwKeaeGKLfkEwnqQRAgMBAAECggEAewKL1s7H514auEeCioVljUOPuwcPPe4xL3/879O3yMPHmyvwg0NptTASol2dip5FwCLBjnT+I3PibQnX51DJhc+4CwVi8bTg9HlpNcEHC9EXDsaetdbBDjW7mc/TdC5X8N11rKt+93IjMn7AIlJVJFuGMj6nyTNbhl2LRMPa5g67+FlXbAu4YTK5FuR1P8AKAyjECmiw0dov8FNHtmrQhcsAdB4I8EHNzyFnDmA9ecsnSQGw05p82JC11r6UlpI3zvcHwX9XtfzphbEW0rQ3eVzek4p9Nvi0z1wvOuHHqNYGlOGePX3tH0TY7+g41TZZwZEEUnH79ySd/nnorYdwAQKBgQD57s/ICRcZp9eKtdyGvKh2TBM1URt47l4cHNAJU+SoSAokAUZDtaWSvvpQmSSHL2CvkY6nbH95IlgHvQphW2sjGQNhEBnbaZJ9p+JfJ+nvRrKR8kc9ZsR9TpAatKIA/0vl2dnX7ugYUk4Hz2aIAIDfCA74oEz1PoBhzel92ZOTgQKBgQCpJYsqXqVP9DTV5Zd4M69LijVwhub8rYH/LiezFyReqtQ1IUG8triYveRpbu9h/zEPZGGl8xfapH+u4KanI8/glbR+Ef3cz2oFaQ7Hs9TVSI04UYCdZsf1PojTpUCJmWPxHT55855Nxclny9aIuf+vDV/WbiqH3eE3ljMNKDQYkQKBgBIdWvX2orP7VEX7dGZXmiYo0WOV41XagPusou9qIzKHNiTx6rPRoJSIPwBEeT9LEcjn1d0QohSXhqXY772qsJM0pugMELO0bSeqWV/oNq5fA2ZMlxk+L5OddBhbazqDRm78YSujZzMMFBfA0n+c+bowjVU72RgVVZzBHeE/OdEBAoGATQh7K8207gfi9DM+25B2WinUkq3tjtAabzP/ApIcjzyvro652I9C3NVGrDnIrdHB7yehTSm8CGh4ehV38JDfwIGNlQjum9yehV5GS+77lDMZlbeQop7HnEphmDoffUsteAcAiBvKUdMtGad8ygIjjv7BUfAUUJJdWqp+D5TqvPECgYEAtLfIbEy3vwYpLYAKZiTQPwuy18UNV6vOPnyLwJ3d/LQ0slnbfO6gL1nS8gnzEGLtN/MRwYjJsUW5F2gzcnLPPmOTiuGFt0d3TqMTnnPaAtmR2Y1vxfwrdf8xtyJfDgtM59mCPjnJNQIinD4Nn/AMhsUC3AfejkeJfOEyYXvnO/k=";

String encryptedText = "OqY8zdB44msKeJ8ysu6HwO/LcwldWly6rTsd3GSxjZ2U9ncSVGjEVaWNeaYROHMJY3YmJMpFQ0bwDUUnWDjOqjNU15O2gKH6N+l4BD2jiYhcSXSgGFPLvQrS+Fb865/Y9f/U9Jqi7zBZtTEXuktIrcCb8Drr3aaT8q3yHEWPCfBBzxtffm60WHU0k1hM6EtZiXufCjD3q4ILEzs/+IOnoZ8njCIc15DD/YN9fBRIifw+zy+EFpCWLlzDeejR2wwqVyENQSmfiChC4EVnULqfHfeSWOqK/QVATYC6ljkr+G4QQQ82VQ8sRGS6x40ClKINTerqKxhSpwNoNuaDqmBkHw=="
4

1 回答 1

1

您的错误是您RSA在解密加密数据时使用的是没有填充的纯文本。

使用 RSA 加密数据时,数据大小必须具有一定的长度。如果要加密的数据太短,则必须通过添加填充字节来扩大到正确的大小(这显然是由加密数据的代码完成的)。

问题不在于您在没有填充的情况下解密数据,因此您得到的是填充数据和解密的消息。

因此,请确保使用相同的填充算法进行加密和解密。您的代码已指定OAEPWithSHA-1AndMGF1Padding为填充,但相关部分已被注释掉。

用于RSA/ECB/OAEPWithSHA-1AndMGF1Padding加密和解密,解密时填充数据将被自动删除。

于 2020-04-16T17:24:08.447 回答