0

我有一个 RSA 加密数据并传递给 C# 的模块。C# 需要根据公钥(64 位编码)和传递的令牌对其进行解密。

我有令牌,64 位编码的公钥,可以帮助我开始使用示例。我从 Java 端所知道的是,它正在使用。我已经从 Java 端得到了结果,需要用 C# 编写一个解析器来解密它。我将公钥和令牌都作为字符串值。

    Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA"
    cipher.init(Cipher.DECRYPT_MODE, key);

谢谢

4

2 回答 2

1

首先,您需要私钥来解密消息。通过“公钥(64 位编码)”,我猜你真正拥有的是 Base-64 编码的证书,标题行写着“----- BEGIN CERTIFICATE-----”和页脚显示“-----END CERTIFICATE-----”。

如果这是正确的,您将需要找到私钥。这有时存储在 PKCS #12 格式文件中,扩展名为“.p12”或“.pfx”。如果私钥存储在此类文件中,您将需要密码才能访问私钥。

或者,OpenSSL 和其他实用程序使用可以是 Base-64 编码或二进制的私钥文件。它们具有多种扩展名,可能受密码保护,也可能不受密码保护。如果您拥有的文件具有“-----BEGIN RSA PRIVATE KEY-----”或“-----BEGIN PRIVATE KEY-----”的标题行,那实际上是私钥.

最后,Windows 可以将私钥存储在其内部密钥库中。

当您澄清私钥的位置时,请更新您的问题。


如果在 Java 端使用私钥,则可能是在尝试执行数字签名。虽然我测试过的所有几个 Java 提供程序在(ab)以这种方式使用时都会产生正确的结果,但如果您正在执行签名,则Signature应该使用该类。C# 代码也应该使用签名对象来“验证”签名。

使用私钥执行加密。由于公钥公开的,任何人都可以解密消息;即,消息不是机密的。收件人使用公钥来验证签名的消息。

于 2009-10-20T17:51:22.330 回答
1

检查此代码。

public static string Decrypt(string inputText)
      {
        RijndaelManaged rijndaelCipher = new RijndaelManaged();
        byte[] encryptedData = Convert.FromBase64String(inputText.Replace(" ","+"));
        PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);

        using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
        {
          using (MemoryStream memoryStream = new MemoryStream(encryptedData))
          {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
            {
              byte[] plainText = new byte[encryptedData.Length];
              int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);
              return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
            }
          }
        }
于 2009-10-20T17:52:22.663 回答