Cross platform (php to C# .NET) encryption/decryption with Rijndael -


i'm having bit of problem decrypting message encrypted php mcrypt. php code following:

<?php   //$iv_size = mcrypt_get_iv_size(mcrypt_rijndael_256, mcrypt_mode_cbc);   $iv = "45287112549354892144548565456541";   $key = "anjueolkdiwpoida";   $text = "this encrypted message";   $crypttext = mcrypt_encrypt(mcrypt_rijndael_256, $key, $text, mcrypt_mode_cbc, $iv);   $crypttext = urlencode($crypttext);   $crypttext64=base64_encode($crypttext);   print($crypttext64) . "\n<br/>"; ?> 

the encrypted message sent asp.net platform (c#). however, i'm having problem retaining order of decryption (base64 decode urldecode). code had in asp.net following (iv , key same in php):

public string decode(string str) {     byte[] decbuff = convert.frombase64string(str);     return system.text.encoding.utf8.getstring(decbuff); }  static public string decryptrj256(string cypher, string keystring, string ivstring) {      string sret = "";     rijndaelmanaged rj = new rijndaelmanaged();     utf8encoding encoding = new utf8encoding();       try     {         //byte[] message = convert.frombase64string(cypher);         byte[] message = encoding.getbytes(cypher);          byte[] key = encoding.getbytes(keystring);         byte[] iv = encoding.getbytes(ivstring);          rj.padding = paddingmode.zeros;         rj.mode = ciphermode.cbc;         rj.keysize = 256;         rj.blocksize = 256;         rj.key = key;         rj.iv = iv;         memorystream ms = new memorystream(message);          using (cryptostream cs = new cryptostream(ms, rj.createdecryptor(key, iv), cryptostreammode.read))         {             using (streamreader sr = new streamreader(cs))             {                 sret = sr.readtoend();             }         }      }         {         rj.clear();     }      return sret;   }  string temp = decryptrj256(server.urldecode(decode(cypher)), keystring, ivstring); 

the problem i'm having after recieved encrypted message php, converted byte[] , converted utf8 encoded string can urldecode it. feed result function converted string byte[] , ran through decryption process. however, can't desired result...any ideas?

thanks in advance.

here can see problems on both sides.

please keep in mind when encoding not string, rather array of bytes. in php don't need urlencode cyphertext.

base64 encoding need. when open base64_encode help see

base64_encode encodes given data base64. encoding designed make binary data survive transport

one more thing - have message decoded in .net correct length, have manually append padding characters. default padding mode rijndaelmanaged pkcs7, lets' stick it. have extend source string blocks characters code equal number of padding bytes.

<?php   $iv = "45287112549354892144548565456541";   $key = "anjueolkdiwpoida";   $text = "this encrypted message";    // append string trailing characters pkcs7 padding scheme   $block = mcrypt_get_block_size(mcrypt_rijndael_256, mcrypt_mode_cbc);   $padding = $block - (strlen($text) % $block);   $text .= str_repeat(chr($padding), $padding);    $crypttext = mcrypt_encrypt(mcrypt_rijndael_256, $key, $text, mcrypt_mode_cbc, $iv);    // not needed here               //$crypttext = urlencode($crypttext);    $crypttext64=base64_encode($crypttext);   print($crypttext64) . "\n<br/>"; ?> 

at c# side have casting base64 byte[] string byte[]. have first conversion base64 byte[] only. remember, base64 holding cyphered text binary data, not string. please note rijndaelmanaged idisposable, have wrapped in using() construct. calling close() necessary not enough stated in msdn.

public byte[] decode(string str) {     var decbuff = convert.frombase64string(str);     return decbuff; }  static public string decryptrj256(byte[] cypher, string keystring, string ivstring) {     var sret = "";      var encoding = new utf8encoding();     var key = encoding.getbytes(keystring);     var iv = encoding.getbytes(ivstring);      using (var rj = new rijndaelmanaged())     {         try         {             rj.padding = paddingmode.pkcs7;             rj.mode = ciphermode.cbc;             rj.keysize = 256;             rj.blocksize = 256;             rj.key = key;             rj.iv = iv;             var ms = new memorystream(cypher);              using (var cs = new cryptostream(ms, rj.createdecryptor(key, iv), cryptostreammode.read))             {                 using (var sr = new streamreader(cs))                 {                     sret = sr.readline();                 }             }         }                 {             rj.clear();         }     }      return sret; } 

as result, following code in c# return initial string:

var iv = "45287112549354892144548565456541"; var key = "anjueolkdiwpoida"; var cypher = "u+rilhb/2rrt/u/qfinnlekg2unhizsnzgvb9o54sp8=";  var temp = decryptrj256(decode(cypher), key, iv); 

Comments

Popular posts from this blog

asp.net - repeatedly call AddImageUrl(url) to assemble pdf document -

java - Android recognize cell phone with keyboard or not? -

iphone - How would you achieve a LED Scrolling effect? -