【发布时间】: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