【问题标题】:RSA using SpongyCastleRSA 使用 SpongyCastle
【发布时间】:2014-03-11 04:56:13
【问题描述】:

我的加密知识非常基础,因此对我的任何无知表示歉意。

在 Android 应用程序中,我目前正在尝试使用 SpongyCastle library 和标准 java.security 库来模拟此命令的执行:

echo 'test' | openssl rsautl -encrypt -pubin -inkey test.pub | base64 > encrypted_file

应该注意的是,命令中的文件读取/写入不会实现,我将我的公钥(即test.pub)作为Base64编码字符串@ 987654325@ 在我的代码中。

我尝试了以下方法,但确定它不起作用:

static {
       Security.insertProviderAt(new BouncyCastleProvider(), 1);
      }

//...more code here

byte[] pka = Base64.decode(base64key);

X509EncodedKeySpec x = new X509EncodedKeySpec(pka);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(x);

byte[] testToByte = "test".getBytes("UTF8"); 

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(2048); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, publicKey); 

byte[] cipherText = cipher.doFinal(testToByte); 

String encrypted = Base64.encode((new String(cipherText, "UTF8").toString().getBytes()))

我知道这很遥远,但不知道该转向哪里。任何帮助,将不胜感激。

【问题讨论】:

    标签: java android encryption spongycastle


    【解决方案1】:

    最终通过以下方法解决了这个问题:

    private void stripHeaders(){
    
        public_key = public_key.replace("-----BEGIN PUBLIC KEY-----", "");
        public_key = public_key.replace("-----END PUBLIC KEY-----", "");
    
    }
    
    public byte[] encryptWithPublicKey(String encrypt) throws Exception {
        byte[] message = encrypt.getBytes("UTF-8");
        stripHeaders(); 
        PublicKey apiPublicKey= getRSAPublicKeyFromString(); 
        Cipher rsaCipher = Cipher.getInstance("RSA/None/PKCS1Padding", "SC");
        rsaCipher.init(Cipher.ENCRYPT_MODE, apiPublicKey); 
        return rsaCipher.doFinal(message);
    }
    
    private PublicKey getRSAPublicKeyFromString() throws Exception{
        KeyFactory keyFactory = KeyFactory.getInstance("RSA", "SC"); 
        byte[] publicKeyBytes = Base64.decode(public_key.getBytes("UTF-8"), Base64.DEFAULT); 
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes); 
        return keyFactory.generatePublic(x509KeySpec);
    }
    

    【讨论】:

    • 链式模式是对称密码的一个重要问题(除了数据总是短且随机的罕见应用)。 RSA 是一种非对称密码(和签名),具有相当大的块(例如,对于 2048 位密钥,大约 230 个字节)并且几乎从不用于大于一个块的数据。 Java JCA 接口使用标准格式密码/模式/填充,但对于 RSA 模式没有意义。然而,填充是;除非您对数据非常小心,否则使用 RSA//NoPadding 可能不安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多