1

我正在 Android、Windows 8 Tablet/Desktop 和 Windows phone 8 中开发应用程序。我在 Android 和 Windows 8 Tablet/Desktop 应用程序中使用 AES CBC 算法,并且能够正确加密和解​​密。我必须在 Windows 中使用相同的算法phone 8.我从网络上的一个示例中尝试过,但问题是在 Windows 8 Tab/Desktop 应用程序和 Windows phone 8 中加密相同的字符串时两者都不同。我确信 Windows Tab/Desktop 可以正常工作已经在 appstore 中,它适用于 Android 应用程序。

算法的安卓代码

公共静态字符串加密(字符串纯文本,字符串密码)抛出异常 {

    if (plainText == null || plainText.length() == 0)
        return "";

    // convert key to bytes
    byte[] keyBytes = password.getBytes("UTF-8");
    // Use the first 16 bytes (or even less if key is shorter)

    byte[] keyBytes16 = new byte[16];

    System.arraycopy(keyBytes, 0, keyBytes16, 0,
            Math.min(keyBytes.length, 16));

    // convert plain text to bytes
    byte[] plainBytes = plainText.getBytes("UTF-8");

    // setup cipher
    SecretKeySpec skeySpec = new SecretKeySpec(keyBytes16, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] iv = new byte[16]; // initialization vector with all 0
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv));

    // encrypt
    byte[] encrypted = cipher.doFinal(plainBytes);
    String encryptedString = Base64.encodeToString(
            cipher.doFinal(plainBytes), Base64.NO_WRAP);
    // encryptedString

    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

视窗电话 8

public static string Encrypt1(string dataToEncrypt, string password, string salt)


 {

AesManaged aes = null;
            MemoryStream memoryStream = null;
            CryptoStream cryptoStream = null;


try
            {
                byte[] b = new byte[16];
                byte[] pwd = System.Text.UTF8Encoding.UTF8.GetBytes(password);
                byte[] pwd1 = new byte[16];
                for (int i = 0; i < 16;i++ ) // take first 16 bits of the password
                {
                    pwd1[i] = pwd[i];
                }

String newPwd = System.Text.Encoding.UTF8.GetString(pwd1, 0 ,pwd1.Length);

                //Generate a Key based on a Password, Salt and HMACSHA1 pseudo-random number generator 
                Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(newPwd, b);

                //Create AES algorithm with 256 bit key and 128-bit block size 
                aes = new AesManaged();
                //aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
                aes.KeySize = 128;
                aes.Key = rfc2898.GetBytes(128 / 8);
                aes.IV = rfc2898.GetBytes(128 / 8);
                //aes.IV = b;
                //Create Memory and Crypto Streams 
                memoryStream = new MemoryStream();
                cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
                //Encrypt Data 
                byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
                cryptoStream.Write(data, 0, data.Length);
                cryptoStream.FlushFinalBlock();
                //Return Base 64 String 
                return Convert.ToBase64String(memoryStream.ToArray());
            }
            finally
            {
                if (cryptoStream != null)
                    cryptoStream.Close();
                if (memoryStream != null)
                    memoryStream.Close();
                if (aes != null)
                    aes.Clear();
            }
        }

我知道我的 win phone 8 算法有问题。请帮我找出答案。非常感谢任何帮助。

4

1 回答 1

0

Rfc2898DeriveBytes在 Windows 应用程序中使用 PBKDF2 密钥派生方案,并在 android 代码中直接创建密钥/IV。请升级 Android 代码以使用 PBKDF2(查看此站点以获取实现)并且 - 如果您要通过网络发送密文 - 不要忘记添加身份验证标签以防止中间人和填充预言机攻击。

请注意,仅从 Internet 复制代码并不能为您提供很多针对攻击者的保护。在开始实施任何东西之前,您需要了解要保护的内容以及至少应用密码学的一些基础知识。

您开始实施密码学时,请注意它对于小错误并不是很宽容。一个错误的位将完全弄乱您的密文-没有警告,没有特定错误。因此,记录所有输入/输出参数的所有十六进制表示- 这会尽早向您显示不同的键和 IV 值。

于 2013-08-14T12:50:49.373 回答