黑莓RSA Decryption总是挂起

时间:2012-03-02 18:58:10

标签: blackberry encryption cryptography rsa

我今天一直在修补BB RSA Crypto并成功加密了一个字符串(我想,无法解密来测试)。我的问题在于解密。我已经搜索了论坛并尝试了许多代码组合,但似乎没有任何效果。所有解密cipertext的调用都会挂起/阻止该应用。

好吧,我只是在模拟器上尝试过,它会阻塞超过10分钟。我假设有些事情错了。

下面我展示了加密和解密String的代码。任何洞察我的解密程序的错误将不胜感激。感谢。

            cryptoSystem = new RSACryptoSystem(1024);
        byte[] expo = Base64InputStream.decode(exponent, 0, exponent.length());
        byte[] modul = Base64InputStream.decode(modulus, 0, modulus.length());


        byte[] pArr = Base64InputStream.decode(p, 0, p.length());
        byte[] qArr  = Base64InputStream.decode(q, 0, q.length());
        byte[] dpArr = Base64InputStream.decode(dp, 0, dp.length());
        byte[] dqArr = Base64InputStream.decode(dq, 0, dq.length());
        byte[] inverseQArr = Base64InputStream.decode(inverseQ, 0, inverseQ.length());
        byte[] dArr = Base64InputStream.decode(d, 0, d.length());


        // Public Key Setup
        RSAPublicKey publicKey = new RSAPublicKey( cryptoSystem, expo, modul);
        RSAEncryptorEngine eEngine = new RSAEncryptorEngine( publicKey );
        fEngine = new PKCS1FormatterEngine(eEngine);

        // Private Key Setup
        RSAPrivateKey privateKey = new RSAPrivateKey(cryptoSystem, expo, pArr, qArr, dpArr, dqArr, inverseQArr);
        dEngine = new RSADecryptorEngine(privateKey);
        ufEngine = new PKCS1UnformatterEngine(dEngine);

        // ################################ ENCRYPTION ################################
        BlockEncryptor cryptoStream = new BlockEncryptor( fEngine, out );   
        cryptoStream.write( data, 0, data.length );
        cryptoStream.close();
        out.close();
        // ################################ END ENCRYPTION ################################

        // Convert encrypted bytes to text;
        int finalLength = out.size();
        byte[] cipherText = new byte[finalLength];
        System.arraycopy(out.getByteArray(), 0, cipherText, 0, finalLength);
        cipherText = out.toByteArray();

        // ################################ DECRYPTION ################################
        ByteArrayInputStream inputStream = new ByteArrayInputStream(cipherText);
        byte[] plainText = new byte[finalLength];
        BlockDecryptor decryptor = new BlockDecryptor(new PKCS1UnformatterEngine(new RSADecryptorEngine(privateKey)), inputStream);
        decryptor.read(plainText, 0, finalLength); // THIS HANGS APP
        //IOUtilities.streamToBytes(decryptor); // AND ALSO THIS

        String strPlaintText = new String(plainText);
        // ################################ END DECRYPTION ################################

1 个答案:

答案 0 :(得分:2)

通常,您不使用RSA算法直接加密文本作为分组密码。通常的方法是创建随机对称/密钥(例如AES),然后使用它来加密纯文本。然后使用公钥和RSA加密对AES密钥进行加密。您将加密的纯文本和加密的对称AES密钥发送到接收方。接收方首先解密AES密钥,然后解密密文。

RSA很慢,非常慢,特别是在解密期间。因为公共指数通常是一个短数字,设置了几个比特(0x010001是常见的,第四个数字的费马),所以加密仍然相当快。解密不是,并且您将有相当大的开销,因为对于每个加密块,密文将比纯文本短至少11个字节。

不要使用RSA进行块加密,使用AES CBC和随机IV&改为PKCS5Padding。