0

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 文字列ではないと言っています。これは、Base 65 ではない文字が含まれているためです。

これは 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);
    }

問題は、次の 2 行のいくつかで発生します。

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

1 に答える 1

2

まず、実際に何completeEncodedKeyを表現しようとしているのかが明確ではありません。暗号化されたキーを返すことを意図した cryptograph.exe の結果である場合は、確かにそれを復号化する必要があります。これは、ここで実際に行っていることではありません。

とにかく、これが問題だと確信しています(2回、IV用に1回、キー用に1回):

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 から2 回変換するのはなぜですか? 「全体」の値が 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]);
于 2013-03-14T20:39:48.857 に答える