2013-03-14 60 views
0

我在C#中使用Base64字符串时遇到问题#Base64无效的字符串错误

我有一个从PHP调用的.exe。它得到2个参数并返回一个加密密钥。 (.exe文件是哪里有问题)

在PHP我这样做:

<?php 
$key = "AAAA"; 
$pass=" AAAA"; 
echo shell_exec("cryptograph.exe generateKey $key $pass"); 
?> 

它应该工作,becouse这些都是基地64串,或者至少,据我所知,有一个String 4的长度倍数是有效的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字符串,becouse它包含一个char这是毫无基地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]); 
+0

有你在争论之间尝试逗号而不是空格?这就是代码看起来像它期望的那样 – Petesh 2013-03-14 20:36:59

+0

当您完成编码密钥的Console.WriteLine时,写什么? – 2013-03-14 20:39:25

+0

刚刚尝试过,结果相同。 cryptograph.exe是一个命令行程序。你可以打开cmd并使用它,当你传递参数时你用一个空格分隔它们。 – leojg 2013-03-14 20:40:27

回答

2

首先,它真的并不清楚completeEncodedKey是为了真正代表。如果这是cryptograph.exe的返回结果加密密钥,那么你肯定需要解密它 - 这不是你实际在这里做的。

无论如何,我敢肯定,这就是问题所在(两次,一次为IV和一次关键):

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]); 
+0

好的,我会尝试, 对不起,如果它是混乱:(代码不是我的,它给了 谢谢 – leojg 2013-03-14 20:42:16

+0

错误已更改: “指定的初始化向量(IV)与此算法的块大小不匹配” 这是否意味着它必须是16个字节长? – leojg 2013-03-14 21:35:36

+0

@ leojg:很可能,说实话,它很不清楚你在'completeEncodedKey'中实际得到的数据是什么意思。 – 2013-03-14 21:55:10

相关问题