使用C#CryptoStream的Java equilavent加密和解密字符串

Boa*_*rdy 4 c# java encryption cryptostream

我正在寻找用Java开发移动平台操作系统的应用程序.

我已经在C#WPF中为Windows环境开发了一个应用程序.我使用cryptostream以使用以下代码加密和解密字符串.下面显示的代码只是加密

public string encrypt(string encryptionString)
    {
        byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);

        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();

        MemoryStream ms = new MemoryStream();
        byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
        byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
        CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);

        cs.Write(clearTextBytes, 0, clearTextBytes.Length);

        cs.Close();

        return Convert.ToBase64String(ms.ToArray());
    }
Run Code Online (Sandbox Code Playgroud)

加密的字符串存储在在线数据库中.我需要做的是让java应用程序能够从数据库中读取字符串并使用C#应用程序中的相同加密密钥解密字符串.

谢谢你的帮助.

Cam*_*ner 6

就个人而言,我喜欢BouncyCastle for Java加密.这段代码(使用BouncyCastle轻量级API)可以解决这个问题:

String decrypt(byte[] cryptoBytes, byte[] key, byte[] iv) {
    BlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
    cipher.init(false, new ParametersWithIV(new KeyParameter(key), iv));
    byte[] out = new byte[cipher.getOutputSize(cryptoBytes.length)];
    int offset = cipher.processBytes(cryptoBytes, 0, cryptoBytes.length, out, 0);
    cipher.doFinal(out, offset);
    return new String(out);
}
Run Code Online (Sandbox Code Playgroud)

我发现BouncyCastle的轻量级API比JCE提供程序的东西更少痛苦,但如果你愿意,你可以将它作为提供者使用.

它看起来像.net SymmetricAlgorithm和BC PaddedBufferedBlockCipher默认为PKCS7填充,所以你应该可以使用默认值.