繁体   English   中英

RSA/ECB/PKCSPadding1 使用 .NET 从公钥字节加密

[英]RSA/ECB/PKCSPadding1 encryption with .NET from public key bytes

我希望 C# 代码使用 RSA/ECB/PKCSPadding1 密码和公钥的字节来加密一个小字符串(密码)。 加密测试是使用私钥用 Java 代码(明确支持此密码)解密加密值。 Java 代码如下所示:

static String decrypt(String encryptedB64, String privateKeyBase64)
{
    try {
        byte[] privateKeyBytes = Base64.decodeBase64(privateKeyBase64);
        Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");

        KeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

        rsa.init(Cipher.DECRYPT_MODE, privateKey);
        return new String(rsa.doFinal(Base64.decodeBase64(encryptedB64)), StandardCharsets.UTF_8);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

更高版本的 dotnet 平台明确支持 PKCS1 填充。 这段代码对我有用。 我用 C# 加密并确认我可以使用 Java 和 RSA/ECB/PKCS1Padding 密码解密。 唯一的问题是我必须提前知道公钥中有多少位(例如 1024、2048)。

using System;
using System.Security.Cryptography;

class Program
{

    static void Main(string[] args)
    {
        String pubB64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCK8xP3JO4exQPIB2eDpAVXasM3YOoZN405HuaSjr1FVE0Z++jKrVhTiOYqiXX7ksChmoEt4uim+tWK/1SNpMyD/nl4SsQjkG0zRJr+kfP4owDnQdZRDPpLZABI2X5O6o5bgwPsxY3UfuenwrKc1/FQRITfaTp7nyoX956EZ9v4dQIDAQAB";
        String text = "abcdefg123456";
        byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(text);
        byte[] publicKeyBytes = Convert.FromBase64String(pubB64);

        var keyLengthBits = 1024;  // need to know length of public key in advance!
        byte[] exponent = new byte[3];
        byte[] modulus = new byte[keyLengthBits / 8];
        Array.Copy(publicKeyBytes, publicKeyBytes.Length - exponent.Length, exponent, 0, exponent.Length);
        Array.Copy(publicKeyBytes, publicKeyBytes.Length - exponent.Length - 2 - modulus.Length, modulus, 0, modulus.Length);

        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        RSAParameters rsaKeyInfo = rsa.ExportParameters(false);
        rsaKeyInfo.Modulus = modulus;
        rsaKeyInfo.Exponent = exponent;
        rsa.ImportParameters(rsaKeyInfo);

        byte[] encrypted = rsa.Encrypt(textBytes, RSAEncryptionPadding.Pkcs1);
        Console.WriteLine(Convert.ToBase64String(encrypted));

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM