Base64无效字符串错误
本文关键字:错误 字符串 无效 Base64 | 更新日期: 2023-09-27 18:04:02
我在c#中使用Base64字符串有一个问题
我有一个从php调用的。exe。它获得2个参数并返回一个加密的密钥。(.exe是我有问题的地方)
在php中,我这样做:<?php
$key = "AAAA";
$pass=" AAAA";
echo shell_exec("cryptograph.exe generateKey $key $pass");
?>
它应该工作,因为那些是64进制字符串,或者至少,我理解长度为4的倍数的字符串是有效的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字符串,因为它包含一个不是base65的字符,超过两个没有空格的填充符(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]);
首先,确实不清楚completeEncodedKey
真正代表什么。如果它是cryptography .exe的结果,它意味着返回一个加密的密钥,那么你肯定需要解密它-这不是你在这里实际做的。
无论如何,我确信这就是问题所在(两次,一次为IV,一次为key):
aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString
(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);
让我们把它分开一点,以保持理智:
byte[] completeBinaryKey = Convert.FromBase64String(completeEncodedKey);
string asciiKey = ASCIIEncoding.UTF8.GetString(completeBinaryKey);
string[] parts = asciiKey.Split(',');
string ivBase64 = parts[0];
aesEncryption.IV = Convert.FromBase64String(ivBase64);
首先,ASCIIEncoding.UTF8
是非常令人困惑的。如果真的只想要UTF-8,为什么要使用ASCII呢?你应该用Encoding.UTF8
更清楚。然而,我不认为你真的想要这个。
为什么要从base64 转换两次?如果"总体"值是utf -8编码的文本,为什么要将其转换为base64?
我强烈怀疑你的文本实际上是的形式:
<base64-encoded-iv>,<base64-encoded-key>
在这种情况下,您只需要将和拆分为base64转换:
string[] parts = completeEncodedKey.Split(',');
aesEncryption.IV = Convert.FromBase64String(parts[0]);
aesEncryption.Key = Convert.FromBase64String(parts[1]);