3
我试图在Android应用程序中加密一个字符串,然后在ASP.Net服务器中解密它。我没有收到任何错误,但解密不会返回真正的结果。这里就是Android侧:AES解密给出错误结果
public void clckBtn(View v) {
try {
SecretKeySpec skeySpec = new SecretKeySpec(
"MyDifficultPassw".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal("tryToEncrypt".getBytes());
System.out.println(toHex(encrypted));
} catch (Exception e) {
System.out.println(e.toString());
}
}
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private final static String HEX = "ABCDEF";
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
的输出是:CE3E99F50E6D30201E38D4955F07BA7C
Asp.Net侧:
protected void Page_Load(object sender, EventArgs e)
{
using (Aes myAes = Aes.Create())
{
string asd = DecryptStringFromBytes_Aes(GetBytes("CE3E99F50E6D30201E38D4955F07BA7C"), GetBytes("MyDifficultPassw"), myAes.IV);
int we = 0;
}
}
static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key
, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
aesAlg.Padding = PaddingMode.None;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key
, aesAlg.IV);
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt
, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(
csDecrypt))
{
// Read the decrypted bytes from the decrypting
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
在Asp.Net AES类需要一个IV(初始化矢量)。在Android中没有这样的事情。我认为这个问题是有关于此的。
基本上,你需要确保这些匹配:键,IV,填充,模式。我没有编程Android,但在谷歌上的快速搜索指向我[这](http://stackoverflow.com/a/16854800/706456)。也许你可以从那里获得解决方案。 – oleksii
您在.NET代码中使用Java代码和CBC模式使用ECB模式。另外,我怀疑这段代码实际上并没有完成你所要做的([相关问题])(http://security.stackexchange.com/questions/52584/why-can-we-still-crack-sriest-photos-在-12-线-的旁注))。也许[TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security)更合适? – ntoskrnl