2015-08-07 3 views
2

по какой-то причине мне нужно расшифровать некоторую строку, которая была зашифрована алгоритмом AES (с использованием C#), но я не очень хорошо знаком с ним, у меня есть исходный код (код C#). и я также попытался использовать java для его расшифровки, но не смог.как расшифровать зашифрованную строку, использующую алгоритм AES в java

здесь исходный код C#

public class SymmetricEncrypt 
{ 
    private byte[] cipherbytes; 
    private byte[] finalbytes; 
    private string plainTextValue; 
    private static char seprate = ';'; 
    private SymmetricAlgorithm syma = Rijndael.Create(); 
    private string symmetricKeyValue = "^_^[email protected][email protected]*_*b-_-b^_^[email protected][email protected]*_*b-_-b"; 

    public SymmetricEncrypt() 
    { 
     this.Init(); 
    } 

    public static string[] ConvertByteAryToStringAry(byte[] args) 
    { 
     string[] strArray = new string[args.Length]; 
     for (int i = 0; i < args.Length; i++) 
     { 
      strArray[i] = args[i].ToString(); 
     } 
     return strArray; 
    } 

    public static byte[] ConvertStringAryToByteAry(string[] args) 
    { 
     byte[] buffer = new byte[args.Length]; 
     for (int i = 0; i < args.Length; i++) 
     { 
      buffer[i] = Convert.ToByte(args[i]); 
     } 
     return buffer; 
    } 

    public string Decrypt(string[] args) 
    { 
     return this.Decrypt(ConvertStringAryToByteAry(args)); 
    } 

    public string Decrypt(string args) 
    { 
     string[] strArray = args.Split(new char[] { seprate }); 
     return this.Decrypt(ConvertStringAryToByteAry(strArray)); 
    } 

    public string Decrypt(byte[] args) 
    { 
     MemoryStream stream = new MemoryStream(args); 
     CryptoStream stream2 = new CryptoStream(stream, this.syma.CreateDecryptor(), CryptoStreamMode.Read); 
     List<byte> list = new List<byte>(); 
     int num = 0; 
     do 
     { 
      num = stream2.ReadByte(); 
      if (num != -1) 
      { 
       list.Add(Convert.ToByte(num)); 
      } 
     } 
     while (num != -1); 
     this.finalbytes = list.ToArray(); 
     this.plainTextValue = Encoding.Default.GetString(this.finalbytes); 
     return this.plainTextValue; 
    } 

    public byte[] Encrypt() 
    { 
     MemoryStream stream = new MemoryStream(); 
     CryptoStream stream2 = new CryptoStream(stream, this.syma.CreateEncryptor(), CryptoStreamMode.Write); 
     byte[] bytes = Encoding.Default.GetBytes(this.plainTextValue); 
     stream2.Write(bytes, 0, bytes.Length); 
     stream2.Close(); 
     this.cipherbytes = stream.ToArray(); 
     stream.Close(); 
     return this.cipherbytes; 
    } 

    public string EncryptToString() 
    { 
     StringBuilder builder = new StringBuilder(); 
     string[] strArray = ConvertByteAryToStringAry(this.Encrypt()); 
     if (strArray != null) 
     { 
      for (int i = 0; i < strArray.Length; i++) 
      { 
       if (i == 0) 
       { 
        builder.Append(strArray[i]); 
       } 
       else 
       { 
        builder.Append(seprate.ToString()).Append(strArray[i]); 
       } 
      } 
     } 
     return builder.ToString(); 
    } 

    public string[] EncryptToStringAry() 
    { 
     return ConvertByteAryToStringAry(this.Encrypt()); 
    } 

    public void Init() 
    { 
     byte[] bytes = Encoding.UTF8.GetBytes(this.symmetricKeyValue); 
     this.syma.Key = bytes; 
     this.syma.Mode = CipherMode.ECB; 
     this.syma.Padding = PaddingMode.Zeros; 
    } 

    public string PlainText 
    { 
     get 
     { 
      return this.plainTextValue; 
     } 
     set 
     { 
      if (string.IsNullOrEmpty(value)) 
      { 
       Exception exception = new Exception("明文不能为空!"); 
       throw exception; 
      } 
      this.plainTextValue = value; 
     } 
    } 

    public string SymmetricKey 
    { 
     get 
     { 
      return this.symmetricKeyValue; 
     } 
     set 
     { 
      if (string.IsNullOrEmpty(value)) 
      { 
       Exception exception = new Exception("密钥不能为空!"); 
       throw exception; 
      } 
      if (value.Length != 0x20) 
      { 
       Exception exception2 = new Exception("密钥长度必须是32个字符!"); 
       throw exception2; 
      } 
      this.symmetricKeyValue = value; 
     } 
    } 
} 

здесь является Java-код я пытался расшифровать

public static String aesDecrypt(byte[] strBytes, String keyStr) throws Exception { 
    Cipher cipher = Cipher.getInstance("AES/ECB/NOPadding"); 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    kgen.init(128, new SecureRandom(keyStr.getBytes())); 
    SecretKey secretKey = kgen.generateKey(); 
    byte[] enCodeFormat = secretKey.getEncoded(); 
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); 

    cipher.init(Cipher.DECRYPT_MODE, key); 
    byte[] bytes = cipher.doFinal(strBytes); 
    return new String(bytes, "utf-8"); 
} 

public static byte[] convertStrArrayToByteArray(String s){ 
    String[] ss = s.split(";"); 
    byte[] bs = new byte[ss.length]; 
    int index = 0; 
    for (String byteStr : ss) { 
     bs[index ++] = (byte) (Short.parseShort(byteStr) >> 8 & 0xff); 
    } 
    return bs; 
} 

public static void main(String[] args) throws Exception { 
    byte b = (byte) 158; 
    System.out.println(b); 
    String enStr = "158;244;75;86;184;135;189;50;161;55;60;169;144;186;65;76;37;241;197;21;71;105;113;29;114;92;200;99;102;119;240;124;228;195;12;115;162;186;197;27;40;23;48;24;30;0;98;28;6;113;40;252;191;223;59;138;207;70;31;244;1;9;1;95;66;209;189;115;113;241;122;175;246;155;6;114;221;161;149;246;167;137;27;61;180;122;145;251;52;202;126;242;25;214;129;66;182;176;9;155;36;224;49;158;94;93;53;194;184;46;194;82;203;79;68;185;154;6;182;121;132;233;166;138;209;159;191;126;3;36;113;5;38;84;58;145;78;118;177;222;216;160;217;204;169;153;3;40;198;4;144;137;0;60;96;69;96;4;47;60;69;202;131;250;137;162;192;216;0;95;75;47;3;72;219;85;13;33;88;68;135;239;221;114;171;190;114;128;168;156;230;180;120;251;70;48;151;23;254;221;73;90;111;159;150;22;50;108;133;233;226;157;165;254;14;242;59;176;100;81;27;156;110;194;6;113;40;252;191;223;59;138;207;70;31;244;1;9;1;95;66;209;189;115;113;241;122;175;246;155;6;114;221;161;149;246;145;77;98;181;148;212;44;112;175;96;184;222;128;172;98;31;147;59;158;66;238;255;8;6;100;215;35;228;28;197;52;168;252;239;80;176;80;195;177;197;42;252;47;184;235;64;237;246"; 
    String key = "^_^[email protected][email protected]*_*b-_-b^_^[email protected][email protected]*_*b-_-b"; 
    System.out.println(aesDecrypt(convertStrArrayToByteArray(enStr), key)); 
} 
+0

Существует форум назван как «Кодекс Reviews» в Stack бирже, и я думаю, что этот вопрос должен быть металлообрабатывающим там ... –

+1

@ сайтов XaweryWiśniowiecki StackExchange основы Арен» t, но Q & A сайты. Кроме того, O.P. заявляет, что он не работает, что делает его вне темы. –

+0

Почему вы инициализировали kgen в Java-коде со значением из SecureRandom? Вы просто используете кодировку байтов UTF8 в коде C#. – Martheen

ответ

0

я думаю, я решил проблему ..

спасибо @ Мартенский намек.

изменить код, как fllowed:

public static String aesDecrypt(byte[] strBytes, String keyStr) throws Exception { 
    Cipher cipher = Cipher.getInstance("AES/ECB/NOPadding"); 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    kgen.init(128, new SecureRandom(keyStr.getBytes())); 
    SecretKeySpec key = new SecretKeySpec(keyStr.getBytes(), "AES"); 

    cipher.init(Cipher.DECRYPT_MODE, key); 
    byte[] bytes = cipher.doFinal(strBytes); 
    return new String(bytes, "gb2312"); 
} 

public static byte[] convertStrArrayToByteArray(String s){ 
    String[] ss = s.split(";"); 
    byte[] bs = new byte[ss.length]; 
    int index = 0; 
    for (String byteStr : ss) { 
     bs[index ++] = (byte) (Short.parseShort(byteStr)); 
    } 
    return bs; 
} 

public static void main(String[] args) throws Exception { 
    byte b = (byte) 158; 
    System.out.println(b); 
    String enStr = "158;244;75;86;184;135;189;50;161;55;60;169;144;186;65;76;37;241;197;21;71;105;113;29;114;92;200;99;102;119;240;124;228;195;12;115;162;186;197;27;40;23;48;24;30;0;98;28;6;113;40;252;191;223;59;138;207;70;31;244;1;9;1;95;66;209;189;115;113;241;122;175;246;155;6;114;221;161;149;246;167;137;27;61;180;122;145;251;52;202;126;242;25;214;129;66;182;176;9;155;36;224;49;158;94;93;53;194;184;46;194;82;203;79;68;185;154;6;182;121;132;233;166;138;209;159;191;126;3;36;113;5;38;84;58;145;78;118;177;222;216;160;217;204;169;153;3;40;198;4;144;137;0;60;96;69;96;4;47;60;69;202;131;250;137;162;192;216;0;95;75;47;3;72;219;85;13;33;88;68;135;239;221;114;171;190;114;128;168;156;230;180;120;251;70;48;151;23;254;221;73;90;111;159;150;22;50;108;133;233;226;157;165;254;14;242;59;176;100;81;27;156;110;194;6;113;40;252;191;223;59;138;207;70;31;244;1;9;1;95;66;209;189;115;113;241;122;175;246;155;6;114;221;161;149;246;145;77;98;181;148;212;44;112;175;96;184;222;128;172;98;31;147;59;158;66;238;255;8;6;100;215;35;228;28;197;52;168;252;239;80;176;80;195;177;197;42;252;47;184;235;64;237;246"; 
    String key = "^_^[email protected][email protected]*_*b-_-b^_^[email protected][email protected]*_*b-_-b"; 
    System.out.println(aesDecrypt(convertStrArrayToByteArray(enStr), key)); 
} 
Смежные вопросы