【问题标题】:Encrypt in C# && Decrypt in PHP using PEM file使用 PEM 文件在 C# 中加密 && 在 PHP 中解密
【发布时间】:2017-01-06 13:12:38
【问题描述】:

我正在寻找解决方案,但找不到实用的解决方案。 我需要将字符串(AESkey)从 C# 应用程序传输到 PHP 服务器。 客户端(在 C# 中)下载一个 key.public.pem 文件(公钥)并加密通行证,然后将其发送到服务器。 服务器获取 key.pem 文件(私钥)。

PHP 中的服务器:

function RSADecryption($text) {
    //re() reads a document an return it as string
    openssl_private_decrypt(base64_decode($text), $decrypted,re("key.pem"));
    return $decrypted;
}

C# 中的客户端:

using System;
using System.Text;
using System.Security.Cryptography;


namespace myApp
{
    class MyRSA
    {
        public static MyRSA getMyRSA()
        {
            if (_Instance == null)
            {
                _Instance = new MyRSA();
            }
            return _Instance;
        }
        public Boolean setPubKey(string url)
        {
            System.Net.WebClient wc = new System.Net.WebClient();
            try
            {
                publicKey = wc.DownloadString(url);
            }
            catch(Exception e)
            {
                return false;
            }
            return true;

        }
        public string crypt(string text)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            RSAParameters rsaParam = rsa.ExportParameters(false);
            rsaParam.Modulus = Convert.FromBase64String(publicKey.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", ""));
            rsa.ImportParameters(rsaParam);
            byte[] encValue = rsa.Encrypt(Encoding.UTF8.GetBytes(text), false);

            return Convert.ToBase64String(encValue);
        }


        private static MyRSA _Instance;
        private static string publicKey;

        private MyRSA() {}
    }
}

后来我从 main 做类似的事情:

MyRSA rsa = MyRSA.getMyRSA();
rsa.setPubKey(site+"key.public.pem");
sendData(rsa.crypt(user));

我认为问题出在解密器(PHP 函数)中,因为它没有返回任何内容。 我不知道,但是,也许问题是您不能使用 RSACryptoServiceProvider 加密并使用 openssl 解密? 因为他们使用不同的参数或其他类似的东西?

例如,我生成了这个 AES 密钥:

cA?uW=kImEYGsgu

我使用这个公钥

-----开始公钥----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApxjhdfvCuafPZmE//com OVxBZvMXjwlcyaCfnTuVdbewQ5ITu6hlJ3vX/oTMbik7DprsWoc2tGk3Rx7RdAPd n3VnPm62QjaKtETWJ8/5Nzf+MxlVD0t5tzqzhniZ5BKZTtvCI6STbrFYnKcJwTyI eaEDNtre5EaqEBbrYhlGTRxNmz2SdRi9Im9iCSw9pjDVDDJdzmhENhASmFQMeo7N IS8AY3zJSjOQPKFymZrSa8hxWp88K1/igxs12IhhpqNjMiUi29gH2T+QLPTDzwEq EHTY1K6B0zlNuyp8HR5pNOqYymdnoSpCV3z0deTobAF7KiFYp2pXvoNo8Pc19Yl0 mQIDAQAB -----结束公钥-----

加密的密码是:

CgG33ytbS3CuK + rOpJRamQ6e8xCj7Q35m6YxWXc44r / D03VubXZO1f5 / zF7Zsc42UOOwqbYahApXBXL6o3J5MVu0cDkjstVoUnFJiPRHWmwq9AA0uvLC55gou + VzvmvRzFO38LMZ2BpsQLOjfv16LGWx7MLfKSVFGC8YVHgv6QlEbDFdd / HJDbqAKOoyQWlKXfVeMKmd8ORnq3 + B3Tmk57O3BHDVOlmezSgf + YN828u4ChZ08JzjgBo7MP2xCl6pLEeZxiFGjRwrTgRfLXQ7aMB / RyeMMHwInJiTS3 / M2Mez8C3 / +杂志/ DIfrLDA9LVdRYdy2n4AxbtyrLTun4mjDO + pYS3HqZlGn2MW5Orc9VH + 1CPn2omLVj / qqa6tIoFuJOdpxn / Y9 P>

感谢您的关注。 问候。

【问题讨论】:

  • 这是一个潜在的好问题。至少非常有趣。您能否描述一下您为自己解决问题所做的工作以及您在什么时候陷入困境? (请不要在 cmets 中描述它,而是编辑问题。)
  • 私钥是否真的在生产环境中使用?如果不是,我会说发布它。这样人们就可以将其纳入您的答案中。完全有可能问题是简单的 openssl 不支持私钥所在的格式。没有私钥真的不可能说。

标签: c# php encryption rsa pem


【解决方案1】:

如果您的 .PEM 文件显示“BEGIN PUBLIC KEY”,那么它可能是 X.509 SubjectPublicKeyInfo 结构。这意味着它看起来像

30 xx  // SEQUENCE (SubjectPublicKeyInfo)
  30 0D  // SEQUENCE (AlgorithmIdentifier)
     06 09 2A 86 48 86 F7 0D 01 01 01  // OID (algorithm = rsaEncryption)
     05 00 // NULL (parameters)
  03 xx  // BIT STRING (subjectPublicKey)
     30 xx  // SEQUENCE (RSAPublicKey)
        02 xx [modulus value here]  // INTEGER (Modulus)
        02 xx [exponent value here]  // INTEGER (Exponent)

这是一个 DER 编码的 blob。每个xx 值代表一个长度,可能超过一个字节。

因此,当您加载此密钥时,您将获取所有开销/结构内容,以及模数字节和指数字节,并调用所有该模数。因此,最终结果是您使用的公钥与解密时使用的公钥不同。

.NET 无法轻松读取 PEM 密钥内容。你最好的办法是把这个密钥变成一个证书。如果您还没有证书,您可以openssl req -x509 -new -key theprivatekey.pem -out selfsignedcert.cer(并根据主题提示回答您喜欢的任何内容)。

否则,您现在会沦为 How to load the RSA public key from file in C#(以及其他相关问题)。

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2013-12-25
    • 2018-11-28
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多