Verschlüsseln und Entschlüsseln mithilfe Hüpfburg in c# und php

Ich bin mit der Hüpfburg und den folgenden code in c# zu ver-und entschlüsseln von Daten in c#

public static string BCEncrypt(string input)
{
    string keyString = "mysecretkey12345";
    string keyStringBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(keyString));
    byte[] inputBytes = Encoding.UTF8.GetBytes(input);
    byte[] iv = new byte[16]; 

    //Set up
    AesEngine engine = new AesEngine();
    CbcBlockCipher blockCipher = new CbcBlockCipher(engine); //CBC
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());
   //PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(blockCipher); //Default scheme is PKCS5/PKCS7
   KeyParameter keyParam = new KeyParameter(Convert.FromBase64String(keyStringBase64));
   ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, iv, 0, 16);

   //Encrypt
   cipher.Init(true, keyParamWithIV);
   byte[] outputBytes = new byte[cipher.GetOutputSize(inputBytes.Length)];
   int length = cipher.ProcessBytes(inputBytes, outputBytes, 0);
   cipher.DoFinal(outputBytes, length); //Do the final block
   return Convert.ToBase64String(outputBytes);
}

public static string BCDecrypt(string input)
{
    string keyString = "mysecretkey12345";
    string keyStringBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(keyString));
    byte[] inputBytes = Encoding.UTF8.GetBytes(input);
    byte[] iv = new byte[16];
    //Set up
    AesEngine engine = new AesEngine();
    CbcBlockCipher blockCipher = new CbcBlockCipher(engine); //CBC
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(blockCipher); //Default scheme is PKCS5/PKCS7
    KeyParameter keyParam = new KeyParameter(Convert.FromBase64String(keyStringBase64));
    ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, iv, 0, 16);

    //Decrypt            
    byte[] outputBytes = Convert.FromBase64String(input);
    cipher.Init(false, keyParamWithIV);
    byte[] comparisonBytes = new byte[cipher.GetOutputSize(outputBytes.Length)];
    int length = cipher.ProcessBytes(outputBytes, comparisonBytes, 0);
    cipher.DoFinal(comparisonBytes, length); //Do the final block
    return System.Text.Encoding.UTF8.GetString(comparisonBytes, 0, comparisonBytes.Length);
}

Dies ist der code den php-code, den ich verwende:

<?
    function encrypt($input, $key) {
        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); 
        $input = Security::pkcs5_pad($input, $size); 
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
        mcrypt_generic_init($td, $key, $iv); 
        $data = mcrypt_generic($td, $input); 
        mcrypt_generic_deinit($td); 
        mcrypt_module_close($td); 
        $data = base64_encode($data); 
        return $data; 
   } 

   function pkcs5_pad ($text, $blocksize) { 
       $pad = $blocksize - (strlen($text) % $blocksize); 
       return $text . str_repeat(chr($pad), $pad); 
   }

   function decrypt($sStr, $sKey) {
       $decrypted= mcrypt_decrypt(
          MCRYPT_RIJNDAEL_128,
          $sKey, 
          base64_decode($sStr), 
          MCRYPT_MODE_ECB
       );
       $dec_s = strlen($decrypted); 
       $padding = ord($decrypted[$dec_s-1]); 
       $decrypted = substr($decrypted, 0, -$padding);
       return $decrypted;
   }

   echo "Input: " . $_REQUEST["inp"] . "<br>Decrypt: ". decrypt($_REQUEST["inp"], 'mysecretkey12345')."<br>";
   ?>

Wenn ich versuche zu verschlüsseln, eine kurze Zeichenfolge, die mithilfe von c# wie z.B. „greatscott“ erhalte ich das folgende Ergebnis: dSk7z0F4JYsc0zhl95+yMw==

Diese dann entschlüsselt ok mit dem php-code.

Jedoch, wenn ich versuche zu verschlüsseln, eine längere Zeichenfolge mit der c# – code wie „dies ist ein sehr langer string“ bekomme ich Folgendes Ergebnis: xcL4arrFD8Fie73evfHjvUjNEmZrA9h6smo0zre82hw=

Nicht entschlüsseln. Wenn ich versuche, Sie zu verschlüsseln, die dieselbe Zeichenfolge „dies ist ein sehr langer string“, über die php-Funktion encrypt bekomme ich xcL4arrFD8Fie73evfHjva6yJyeUOrB8iudisdhqk24=

So dass die erste Hälfte der verschlüsselte string ist das gleiche, aber die zweite Hälfte ist nicht. Das macht mich denken, dass ich habe die falsche Polsterung oder so etwas.

Jede Beratung wäre geschätzt.

Dank

  • Openssl für die Verschlüsselung und Entschlüsselung in PHP.
  • Sie sind mit dem ECB-Modus in den PHP-code, und der CBC-Modus in der C# – code. Zudem sind Sie mit einem all-Nullen IV in der C# – verschlüsseln-Funktion, sondern eine zufällige IV in den PHP-code. Sie auch nicht senden, werden die IV in der code. Du hast eine Menge falsch hier.
  • Nutzung des CTR-Modus. Vergessen Sie hörte von einem anderen Modus.
  • GCM in den Sinn kommen würde, oder irgendwelche anderen authentifizierten codes. Aber Sie müssten, um zu Steuern Weg von mcrypt (die meisten beschissen crypto-Bibliothek gibt) da Sie nicht haben, GCM oder CTR-Modus-Verschlüsselung.
InformationsquelleAutor Shane | 2016-10-10



One Reply
  1. 0

    Danke für die Vorschläge Luke und James.

    Ich bin jetzt mit openssl für die Verschlüsselung und Entschlüsselung in PHP und ich bin generating a random IV und übergeben Sie es zurück und vorwärts zwischen den Systemen für die Entschlüsselung.

    Dies ist der code den ich jetzt benutze:

    c#

    public static string BCEncrypt(string input, out string iv_base64)
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        SecureRandom random = new SecureRandom();
        byte[] iv = new byte[16];
        random.NextBytes(iv);
        iv_base64 = Convert.ToBase64String(iv);
        string keyString = "mysecretkey12345";
        string keyStringBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(keyString));
    
        //Set up
        AesEngine engine = new AesEngine();
        CbcBlockCipher blockCipher = new CbcBlockCipher(engine); //CBC
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());
        KeyParameter keyParam = new KeyParameter(Convert.FromBase64String(keyStringBase64));
        ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, iv, 0, 16);
    
        //Encrypt
        cipher.Init(true, keyParamWithIV);
        byte[] outputBytes = new byte[cipher.GetOutputSize(inputBytes.Length)];
        int length = cipher.ProcessBytes(inputBytes, outputBytes, 0);
        cipher.DoFinal(outputBytes, length); //Do the final block
        return Convert.ToBase64String(outputBytes);
    }
    
    public static string BCDecrypt(string input, string iv_base64)
    {
        string keyString = "mysecretkey12345";
        string keyStringBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(keyString));
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] iv = Convert.FromBase64String(iv_base64);
        //Set up
        AesEngine engine = new AesEngine();
        CbcBlockCipher blockCipher = new CbcBlockCipher(engine); //CBC
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());
        KeyParameter keyParam = new KeyParameter(Convert.FromBase64String(keyStringBase64));
        ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, iv, 0, 16);
    
        //Decrypt            
        byte[] outputBytes = Convert.FromBase64String(input);
        cipher.Init(false, keyParamWithIV);
        byte[] comparisonBytes = new byte[cipher.GetOutputSize(outputBytes.Length)];
        int length = cipher.ProcessBytes(outputBytes, comparisonBytes, 0);
        cipher.DoFinal(comparisonBytes, length); //Do the final block
        return Encoding.UTF8.GetString(comparisonBytes, 0, comparisonBytes.Length);
    }

    PHP-Seite wie folgt Aussehen:

    $iv = base64_decode($iv_base64);
    $method = "aes-128-cbc";
    $password = "mysecretkey12345";
    $decrypted = openssl_decrypt($data, $method, $password,0, $iv);

    Zu erzeugen, die iv und verschlüsseln einen string in PHP die ich benutze:

    $iv = openssl_random_pseudo_bytes(16)
    $encrypted = openssl_encrypt("something interesting", $method, $password,0,$iv);

    So, ich bin jetzt in der Lage zu verschlüsseln, in C# oder PHP-und Entschlüsselung in C# oder PHP.

    Leite ich die base-64-codiert iv und verschlüsselte Zeichenfolge zwischen zwei Systemen mithilfe von https.

    Alle Kommentare auf diese Lösung? (Sicherheit oder nicht?)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.