C PHP (Rijdael-128) kullanılarak şifrelenmiş # ile verilerin şifresini çözemez

1 Cevap

Bu kod ile, PHP kullanarak verilerin şifresini çözmek:

$content="1234";
$cp = mcrypt_module_open('rijndael-128', '', 'cbc', '');
$iv = mcrypt_create_iv(16, MCRYPT_RAND);
$key = pack("H*",md5('a'));
mcrypt_generic_init($cp, $key, $iv);
$encrypted = mcrypt_generic($cp, $content);
echo base64_encode($key)."\n";
echo base64_encode($iv)."\n";
echo base64_encode($encrypted)."\n";
mcrypt_generic_deinit($cp);
mcrypt_module_close($cp);

$ Iv ve $ daha sonra dosya ve C # örnek uygulama okumak kaydedilir şifreli:

var iv=...;
var encrypted=...;
var md5 = new MD5CryptoServiceProvider();
var key = md5.ComputeHash(Encoding.Default.GetBytes("a"));
md5.Clear();

Console.WriteLine(Convert.ToBase64String(key));
Console.WriteLine(Convert.ToBase64String(iv));
Console.WriteLine(Convert.ToBase64String(encrypted));

Burada çıkış PHP çıkışı tam olarak aynı olduğunu, bu yüzden hiçbir kodlama hatası inbetween temin ederim.

var rd = new RijndaelManaged {
  Key = key,
  IV = iv,
  Mode = CipherMode.CBC,
  KeySize = 128,
  Padding = PaddingMode.Zeros
};

var buffer = new byte[encrypted.Length];
using(var ms = new MemoryStream(buffer)) {
  using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Write)) {
    cs.Write(encrypted, 0, encrypted.Length);
    ms.Read(buffer, 0, buffer.Length);
    Console.WriteLine(Encoding.Default.GetString(buffer));
  } 
}
rd.Clear();

Deşifresi sonucu bile tam olarak aynı veri girişi ile, her program başlangıcında değişir:

First run:
DMF1ucDxtqgxw5niaXcmYQ== <-Key
GoCeRkrL/EMKNH/BYeLsqQ== <-IV
UBE3DkgbJgj1K/TISugLxA== <-Encrypted
OlOB99yiCYRDoLx+0xxZxQ== <-"Decrypted"

Second run:
DMF1ucDxtqgxw5niaXcmYQ== <-Key
GoCeRkrL/EMKNH/BYeLsqQ== <-IV
UBE3DkgbJgj1K/TISugLxA== <-Encrypted
w5fcY5Fbb9KRgoHfhqAztA== <-"Decrypted"

Anahtar, IV, Şifrelenmiş veri aynıdır, ama yine şifresi tarih değişir ve her zaman yanlıştır. tampon sondaki sıfırları "1234" veya "1234" artı 12 içermelidir.

Ben sonuç değişir ve ne çalışmıyor, ama şimdi birkaç saat boyunca bu kod lanetlemek parçasına bakarak olmuştur neden görmek ve muhtemelen bariz bir hata kaçırmayın ...

Böyle CryptoStream tersine aynı yanlış sonuçlar yaratır:

using(var ms = new MemoryStream(encrypted)) {
  using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read)) {
    cs.Read(buffer, 0, buffer.Length);
    Console.WriteLine(Convert.ToBase64String(buffer));
  }
}

Help? Thanks! Alexander

1 Cevap

Peki, ben bu ile sona erdi geçmişte benim günahlarım eski bir örnek değiştirerek:

static string Decrypt() {            
  byte[] keyBytes = Convert.FromBase64String("DMF1ucDxtqgxw5niaXcmYQ==");
  byte[] iv = Convert.FromBase64String("GoCeRkrL/EMKNH/BYeLsqQ==");
  byte[] cipherTextBytes = Convert.FromBase64String("UBE3DkgbJgj1K/TISugLxA==");

  var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros};

  using (var decryptor = symmetricKey.CreateDecryptor())
  using (var ms = new MemoryStream(cipherTextBytes))
  using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {
    var plainTextBytes = new byte[cipherTextBytes.Length];
    int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
    return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
  }
}

Hangi .. sadece tekrar bir dizeye byte [] dönüştürmek için unutmak mı \ 0 karakterleri sondaki ile "1234" verdi? Ben başka ne fark eksik?