有弹性的城堡DoFinal返回字节数组,但字符串不正确

时间:2018-08-01 22:53:36

标签: c# cryptography bouncycastle

我在解密时遇到问题,当前输出返回一个字节数组,但是当我尝试通过base64,UTF8,Ascii或Unicode将其转换为字符串时,该字符串只是乱码,创建了私有和公共使用openssl并使用它来生成密钥对,使用该密钥作为我的基础,任何有关查找位置的建议都将有所帮助,此外,此git repo测试类中的私钥在解密时也可以正常工作,例如,该私钥似乎工作正常。

  

“MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCPSuFr4iSIaQprjj” + “chHPyDu2NXFe0vDBoTpPkYaK9dehRANCAATnaFz / vQKuO90pxsINyVNWojabHfbx” + “9qIJ6uD7Q7ZSxmtyo / EZ3 / o2kDT8g0pIdyVIYktCsq65VoQIDWSh2Bdm”

但是我生成的这些没有。

  

ME0CAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEMzAxAgEBBCAn0M1F8ej / KhDm2VpEJZtMXGRpwa73m5k3J / D + 5Va9RaAKBggqhkjOPQMBBw ==

open ssl to generate keys:
privatekey:
openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -nocrypt | base64 | paste -sd "\0" -

publickey:
openssl ec -in key.pem -pubout -text -noout 2> /dev/null | grep "pub:" -A5 | sed 1d | xxd -r -p | base64 | paste -sd "\0" -

https://github.com/chengbo/ApplePayAndroidPayDecryption/blob/master/Decryption/TokenDecrypter.cs

KeyParameter keyparam = ParameterUtilities.CreateKeyParameter("AES", encryptionKeyBytes);
ParametersWithIV parameters = new ParametersWithIV(keyparam, symmetricIv);
IBufferedCipher cipher = GetCipher();

cipher.Init(false, parameters);
try
{  
    output = cipher.DoFinal(cipherData);
}
catch (Exception ex)
{
    throw new ApplicationException("Invalid Data", ex);
}

1 个答案:

答案 0 :(得分:-1)

公共静态类AESHelper     {

    public static string Encrypt(string plaintext, string key, string vector)
    {
        return Encrypt(plaintext, key, Encoding.UTF8.GetBytes(vector));
    }

    public static string Encrypt(string plaintext, string key, byte[] vector)
    {
        return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(plaintext), key, vector));
    }

    public static byte[] Encrypt(byte[] plaintext, string key, byte[] vector)
    {
        using (var rijndael = new RijndaelManaged() { Key = Encoding.UTF8.GetBytes(key), Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, IV = vector })
        using (var encryptor = rijndael.CreateEncryptor())
        {
            var resultArray = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length);
            return resultArray;
        }
    }

    public static string Decrypt(string ciphertext, string key, string vector)
    {
        return Decrypt(ciphertext, key, Encoding.UTF8.GetBytes(vector));
    }

    public static string Decrypt(string ciphertext, string key, byte[] vector)
    {
        return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(ciphertext), key, vector));
    }

    public static byte[] Decrypt(byte[] ciphertext, string key, byte[] vector)
    {
        using (var rijndael = new RijndaelManaged() { Key = Encoding.UTF8.GetBytes(key), Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, IV = vector })
        using (var decryptor = rijndael.CreateDecryptor())
        {
            var resultArray = decryptor.TransformFinalBlock(ciphertext, 0, ciphertext.Length);
            return resultArray;
        }
    }
}