Frage

AKTUALISIERT

Ich habe die Änderungen an der C # -Code gemacht, so dass es eine Blockgröße von 256 verwendet, aber jetzt die Hallo Welt sieht wie folgt aus: http://pastebin.com/5sXhMV11 und ich kann nicht herausfinden, was ich mit rtrim () zu bekommen Fahrt des Chaos am Ende.

verwenden sollte

Auch wenn Sie sagen, dass die IV zufällig sein sollte, damit meinen Sie nicht verwenden die gleiche IV mehr als einmal oder ist die Art, wie ich es falsch codiert haben?

Danke nochmal!

Hallo,

Ich versuche, eine Zeichenfolge mit PHP zu entschlüsseln, die in C # verschlüsselt wurden. Ich kann nicht scheinen, PHP, um es mcrypt mit zu entschlüsseln und mit etwas Hilfe tun könnte, bitte. Ich erhalte die folgende Fehlermeldung mit php, damit ich mir vermute, bin nicht richtig IV Einstellung.

Fehler: Die IV-Parameter muss, solange die Blockgröße

sein

Beide Funktionen verwenden, um die gleiche Verschlüsselung, Schlüssel, IV und auf CBC-Modus:

verschlüsselter Text von c # = UmzUCnAzThH0nMkIuMisqg ==
Taste 32 lang = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 = lange 1234567890123456

C #

    public static string EncryptString(string message, string KeyString, string IVString)
    {
        byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
        byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);

        string encrypted = null;
        RijndaelManaged rj = new RijndaelManaged();
        rj.Key = Key;
        rj.IV = IV;
        rj.Mode = CipherMode.CBC;

        try
        {
            MemoryStream ms = new MemoryStream();

            using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(message);
                    sw.Close();
                }
                cs.Close();
            }
            byte[] encoded = ms.ToArray();
            encrypted = Convert.ToBase64String(encoded);

            ms.Close();
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            return null;
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("A file error occurred: {0}", e.Message);
            return null;
        }
        catch (Exception e)
        {
            Console.WriteLine("An error occurred: {0}", e.Message);
        }
        finally
        {
            rj.Clear();
        }

        return encrypted;
    }

PHP

var $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
var $mcrypt_mode = MCRYPT_MODE_CBC;

function decrypt($key, $iv, $encrypted)
{
    $encrypted = base64_decode($encrypted);

    $decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");;
    return $decrypted;
}

Danke

War es hilfreich?

Lösung

Wenn Sie Rijndael256 in Ihrem C # .NET-Anwendung verwenden möchten, müssen Sie die Blockgröße auf 256 gesetzt.

RijndaelManaged rj = new RijndaelManaged();
rj.BlockSize = 256;

Und dann hat Ihre iv 256 Bits lang sein als gut.
finden Sie unter SymmetricAlgorithm.BlockSize Property


Oder andersrum: Derzeit C # Anwendung verwendet Rijndael128 und so muss Ihr PHP-Skript.

<?php
class Foo {
  protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128;
  protected $mcrypt_mode = MCRYPT_MODE_CBC;

  public function decrypt($key, $iv, $encrypted)
  {
    $iv_utf = mb_convert_encoding($iv, 'UTF-8');
    return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);
  }
}



$encrypted = "UmzUCnAzThH0nMkIuMisqg==";
$key = "qwertyuiopasdfghjklzxcvbnmqwerty";
$iv = "1234567890123456";

$foo = new Foo;
echo $foo->decrypt($key, $iv, $encrypted);

druckt hello world

Andere Tipps

Verschlüsseln mit PHP;

/Generate public key for encrytion
$path = "keys/";

    $crt = openssl_x509_read(file_get_contents($path."cert.crt"));
    $publickey = openssl_get_publickey($crt);

    //Encrypt using public key
    openssl_public_encrypt($source, $crypted, $publickey);

    //openssl_private_encrypt($source, $crypted, $privkey);
    echo base64_encode($crypted);

Entschlüsseln mit C #

    X509Certificate2 x509cert = new X509Certificate2(pKeyFilename);
    RSACryptoServiceProvider.UseMachineKeyStore = false;
    RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)x509cert.PrivateKey;                

    byte[] decrypted = crypt.Decrypt(Convert.FromBase64String(data), false);
    return ASCIIEncoding.UTF8.GetString(decrypted);

wo pKeyFilename ist ein Personal Information Exchange Datei mit der Zertifikatsdatei cert.crt erstellt. Dieses Beispiel verwendet eine AES-256-Verschlüsselung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top