在非对称算法中从私钥解析时开始时的未知字符

问题描述 投票:0回答:1

我正在尝试在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=="
android rsa encryption-asymmetric android-security asymmetric
1个回答
0
投票

您的错误是,在解密加密数据时,您使用的是普通RSA,而没有填充。

[使用RSA加密数据时,数据大小必须为一定长度。如果要加密的数据太短,则必须通过在填充字节前添加填充字节将其放大到正确的大小(这显然是通过加密数据的代码完成的)。

问题不是您要在不填充的情况下解密数据,因此要获取填充数据和解密后的消息。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.