Rijndael 256 Verschlüsseln / Entschlüsseln zwischen c # und PHP?
-
26-09-2019 - |
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 sollteAuch 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
seinBeide 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
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.