【问题标题】:Bouncy Castle DoFinal returning byte array but string is not correctBouncy Castle DoFinal 返回字节数组但字符串不正确
【发布时间】:2018-08-01 22:53:36
【问题描述】:

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

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

但是我生成的这个没有。

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

【问题讨论】:

  • 我不知道你的目标是什么。您可以更新问题以说明您正在尝试做什么,然后描述您的尝试出错的地方。即,向我们展示与预期不符的输出,并告诉我们您的预期。

标签: c# cryptography bouncycastle


【解决方案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;
        }
    }
}

【讨论】:

  • 你能解释一下吗?我了解在我的情况下我会使用 byte[] 解密并传入密码测试和初始化向量,但我有几个问题
  • 1.目前我将 IV 设置为此 symmetricIv = Hex.Decode("00000000000000000000000000000000");这是 CRT/无填充的正确初始化向量吗?
  • 2.什么键被传递到字符串键中?私人?公共?共享秘密?
  • dotnet core没有实现CTR模式,可以使用nuget.org/packages/ChilkatDnCore
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2021-10-09
相关资源
最近更新 更多