Base64无效的字符串错误 [英] Base64 Invalid String error

查看:215
本文介绍了Base64无效的字符串错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#中使用Base64 Strings时遇到问题



我有一个从php调用的.exe。它获得2个参数并返回加密密钥。
(.exe是我有问题的地方)



在php中我这样做:

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

它应该工作,因为那些是64个字符串,或者至少我知道一个String长度倍数为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,ms de dos caracteres de relleno o un car cter de relleno que no es un espacio en blanco

基本上,它是没有有效的Base64字符串,因为它包含一个不是Base 65的char,而不是太多的填充(relleno是这样的翻译?)没有空格的chars。



这是c#代码的一部分。

  public static void generateKey(String key,String pass)
{
String e =加密(pass,key,256);
Console.WriteLine(Entro generateKey);
System.Console.WriteLine(e);
}

private static string Encrypt(string plainStr,string fullyEncodedKey,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);
//加密和解密的结果
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 意在真正代表。如果这是cryptograph.exe的结果,这意味着返回一个加密的键,那么肯定你需要解密它 - 这不是你在这里实际做的



无论如何,我确定这是问题(两次,一次为四次,一次为密钥):

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


I have a problem working with Base64 Strings in C#

I have an .exe which is called from php. It gets 2 params and returns an encrypted key. (The .exe is where I have the problem)

In php I do this:

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

It should work, becouse those are base 64 strings, or at least, I understand that a String with a length multiple of 4 is a valid base 64 string.

But I get the following(Is in spanish but I will translate it bellow):

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

Basically it sais that it is no valid Base64 String, becouse it contains a char which is no Base 65, more than too filler(relleno is translate like that?) chars which are no whitespaces.

This is part of the c# code.

    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);
    }

The problem, happens in some of these two lines:

aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);
aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]);

解决方案

Firstly, it's really not clear what completeEncodedKey is meant to really represent. If it's the result of cryptograph.exe which is meant to return an encrypted key, then surely you need to decrypt it - which isn't what you're actually doing here.

Anyway, I'm sure this is the problem (twice, once for IV and once for the key):

aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString
    (Convert.FromBase64String(completeEncodedKey)).Split(',')[0]);

Let's split this up a bit for sanity:

byte[] completeBinaryKey = Convert.FromBase64String(completeEncodedKey);
string asciiKey = ASCIIEncoding.UTF8.GetString(completeBinaryKey);
string[] parts = asciiKey.Split(',');
string ivBase64 = parts[0];
aesEncryption.IV = Convert.FromBase64String(ivBase64);

For a start, ASCIIEncoding.UTF8 is extremely confusing. Why bring ASCII into it if you really just want UTF-8? You should use Encoding.UTF8 to be clearer. However, I don't think you actually want this at all.

Why are you converting from base64 twice? If "overall" value is UTF-8-encoded text, why is it converted to base64?

I strongly suspect your text is actually of the form:

<base64-encoded-iv>,<base64-encoded-key>

In that case, you just need to split then to the base64-conversion:

string[] parts = completeEncodedKey.Split(',');
aesEncryption.IV = Convert.FromBase64String(parts[0]);
aesEncryption.Key = Convert.FromBase64String(parts[1]);

这篇关于Base64无效的字符串错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆