【发布时间】:2013-03-14 20:29:59
【问题描述】:
在 C# 中使用 Base64 字符串时遇到问题
我有一个从 php 调用的 .exe。它获取 2 个参数并返回一个加密密钥。 (.exe 是我遇到问题的地方)
在 php 中我这样做:
<?php
$key = "AAAA";
$pass=" AAAA";
echo shell_exec("cryptograph.exe generateKey $key $pass");
?>
它应该可以工作,因为它们是 base 64 字符串,或者至少,我知道长度为 4 的倍数的 String 是有效的 base 64 字符串。
但我得到以下信息(是西班牙语,但我会在下面翻译):
Encrypt en System.Convert.FromBase64String(String s)
en cryptograph.Cryptography.Encrypt(String plainStr, String completeEncodedKey, Int32 keySize) en cryptograph.Cryptography.generateKey(String key, String pass)
en cryptograph.cryptograph.Main(String[] args)
La entrada no es una cadena Base 64 v lida porque contiene un car cter que no es Base 64, m s de dos caracteres de relleno o un car cter de relleno que no es un espacio en blanco
基本上它不是有效的 Base64 字符串,因为它包含一个不是 Base 65 的字符,而不是填充符(relleno 是这样翻译的吗?)字符不是空格。
这是 c# 代码的一部分。
public static void generateKey(String key, String pass)
{
String e = Encrypt(pass, key, 256);
Console.WriteLine("Entro generateKey");
System.Console.WriteLine(e);
}
private static string Encrypt(string plainStr, string completeEncodedKey, int keySize)
{
Console.WriteLine("Entro Encrypt");
RijndaelManaged aesEncryption = new RijndaelManaged();
aesEncryption.KeySize = keySize;
aesEncryption.BlockSize = 128;
aesEncryption.Mode = CipherMode.CBC;
aesEncryption.Padding = PaddingMode.PKCS7;
Console.WriteLine(completeEncodedKey);
aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);
aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]);
byte[] plainText = ASCIIEncoding.UTF8.GetBytes(plainStr);
ICryptoTransform crypto = aesEncryption.CreateEncryptor();
Console.WriteLine("Abajo de crypto");
// The result of the encryption and decryption
byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length);
return Convert.ToBase64String(cipherText);
}
问题发生在以下两行中:
aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);
aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]);
【问题讨论】:
-
您是否尝试过在参数之间使用逗号而不是空格?这就是代码所期望的样子
-
你Console.WriteLine的completeEncodedKey时,到底写了什么?
-
刚试过,结果一样。 cryptograph.exe 是一个命令行程序。您可以打开 cmd 并使用它,当您传递参数时,用空格分隔它们。
-
"我知道长度为 4 的倍数的字符串是有效的 base 64 字符串。" --> 这确实是错误的。这是需要指出维基百科的情况之一:en.wikipedia.org/wiki/Base64
标签: c# php encryption base64