【发布时间】:2011-05-16 20:44:07
【问题描述】:
我在 php 应用程序和 c# 程序之间传递一些数据 (1-2MB)。信息需要加密,我使用的是 Rijndael 加密,但加密速度很慢。我正在尝试切换到 php 端的 openssl_seal 并使其正常工作:
PHP 代码
<!-- language: lang-php -->
str = 123;
$fp = fopen("/home/prod/publickey.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pk1 = openssl_get_publickey($cert);
openssl_seal($str, $sealed, $ekeys, array($pk1));
openssl_free_key($pk1);
$sealed = base64_encode($sealed);
$Xevk = base64_encode($ekeys[0]);
echo $Xevk."\n\n\n".$sealed;
但我在尝试在 c# 端解密时遇到问题。
C#代码
<!-- language: c# -->
public static string DecryptSSL(string str) {
string[] strs = System.Text.RegularExpressions.Regex.Split(str, "\n\n\n");
X509Certificate2 myCert2 = null;
RSACryptoServiceProvider rsa = null;
try {
myCert2 = new X509Certificate2(Properties.Resources.mycertkey, "");
rsa = (RSACryptoServiceProvider)myCert2.PrivateKey;
} catch(Exception e) {
Console.WriteLine(e.Message);
}
byte[] xkey = rsa.Decrypt(Convert.FromBase64String(strs[0]), false);
byte[] content = Convert.FromBase64String(strs[1]);
EncDec.RC4(ref content, xkey);
return System.Convert.ToBase64String(content);
}
public static void RC4(ref Byte[] bytes, Byte[] key) {
Byte[] s = new Byte[256];
Byte[] k = new Byte[256];
Byte temp;
int i, j;
for(i = 0; i < 256; i++) {
s[i] = (Byte)i;
k[i] = key[i % key.GetLength(0)];
}
j = 0;
for(i = 0; i < 256; i++) {
j = (j + s[i] + k[i]) % 256;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
i = j = 0;
for(int x = 0; x < bytes.GetLength(0); x++) {
i = (i + 1) % 256;
j = (j + s[i]) % 256;
temp = s[i];
s[i] = s[j];
s[j] = temp;
int t = (s[i] + s[j]) % 256;
bytes[x] ^= s[t];
}
}
使用包含来自 php 页面的响应的 ascii 字符串调用 DecryptSSL。
我从来没有得到从解密函数返回的原始字符串,在这种情况下是“123”。我还缺少什么?
【问题讨论】:
标签: c# php encryption openssl