从非对称算法中的私钥进行解析时启动时的未知字符 [英] Unknown characters at starting while parsing from private key in Asymmetric Algorithm

查看:151
本文介绍了从非对称算法中的私钥进行解析时启动时的未知字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Android中实现非对称算法.我已经做到了.但是我在输出时遇到了一个问题.

I am trying to implement asymmetric algorithm in Android. I have managed to do it all. But I am facing an issue while output.

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

What I am getting after decrypting through private key is(Which contains actual text in the end):

�������\�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'}

您可以清楚地看到它存在于解密的字符串中.我知道这是由于某些字符串或其他原因造成的 愚蠢的错误或类似的东西.但是我无法做到这一点.甚至我的加密数据在到达服务器时也有同样的问题.但是,当我最终进行加密和解密时,它可以正常工作.交换密钥时会发生这种情况.

You can clearly see it is present in the decrypted String. I know it is due to some string or some other silly mistake or something like that. But I am unable to get that. Even my encrypted data also have the same issue when it reaches to server. But when I am encrypting and decrypting in my end it works fine. It happens when key is interchanged.

在这里,我附加了负责非对称加密的实际类.具有公钥和私钥.连同要解密的加密文本.

Here, I am attaching my actual class which is responsible for Asymmetric encryption. With public and private key. Along with the encrypted text to be decrypted.

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;
    }

}

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

Here are sample key and value which I am using.

 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=="

推荐答案

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

Your mistake is that you are using plain RSA without padding when decrypting your encrypted data.

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

When encrypting data with RSA the data size has to be of a certain length. If the data to be encrypted is too short it has to enlarged to the correct size by prepending padding bytes (which is obviously done by the code that encrypts the data).

问题不在于您要在不进行填充的情况下解密数据,而是要获取填充数据和解密后的消息.

The problem is not that you are decrypting the data without padding and hence you are getting the padding data plus the decrypted message.

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

Therefore make sure to use for encryption and decryption the same padding algorithm. Your code already specifies OAEPWithSHA-1AndMGF1Padding as padding but the relevant parts are commented out.

使用RSA/ECB/OAEPWithSHA-1AndMGF1Padding进行加密和解密,填充数据将在解密后自动删除.

Use RSA/ECB/OAEPWithSHA-1AndMGF1Padding for encryption and decryption and the padding data will be automatically removed upon decryption.

这篇关于从非对称算法中的私钥进行解析时启动时的未知字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆