AES Decryption失败,API级别为26+

时间:2018-06-08 13:59:53

标签: android aes

我的一位客户开始面临登录问题。在初步分析之后,他使用的凭据似乎没有针对Android API 26+进行解密。他可以使用API​​低于26的iOS应用或Android设备登录,但代码无变化。现在我不确定Android在加密逻辑方面的变化。

这是我的应用程序堆栈
iOS App:使用Xamarin构建(加密用户ID和密码以生成令牌)
Android App:原生Android开发平台(加密用户ID和密码以生成令牌)
API :使用.NET WCF构建(解密令牌以验证用户身份)

这是Android代码

import android.support.v7.app.AppCompatActivity;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import java.security.AlgorithmParameters;

public class Encryptor {

    final static String base64Key = "**********";
    final static String base64Iv = "*********";

    public static String encrypt(final String message) throws Exception
    {
        byte[] b = message.getBytes("Unicode");
        return new String(Base64.encodeBase64(Encryptor.transform(Cipher.ENCRYPT_MODE, b)));
    }

    private static byte[] transform(final int mode, final byte[] messageBytes) throws Exception
    {
        final SecretKeySpec keySpec = new SecretKeySpec(base64Key.getBytes("UTF-8"), "AES");
        final IvParameterSpec ivSpec = new IvParameterSpec(base64Iv.getBytes("UTF-8"));
        final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(mode, keySpec, ivSpec);
        return cipher.doFinal(messageBytes);
    }

    public static String getKey() throws Exception{
        return encrypt(Session.getUserProfile().userName + "," + Session.getUserProfile().password);
    }
}

以下是用于解密的.NET代码

    private const string AesIV = @"******";
    private const string AesKey = @"*******";

    public static string Decrypt(string text)
    {
        try
        {
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.BlockSize = 128;
            aes.KeySize = 128;
            aes.IV = Encoding.UTF8.GetBytes(AesIV);
            aes.Key = Encoding.UTF8.GetBytes(AesKey);
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            // Convert Base64 strings to byte array
            byte[] src = System.Convert.FromBase64String(text);

            // decryption
            using (ICryptoTransform decrypt = aes.CreateDecryptor())
            {
                byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
                return Encoding.Unicode.GetString(dest);
            }
        }
        catch (CustomException ex)
        {
            throw new CustomException(ErrorCodesRepository.EnumUserLoginErrors.UL_INVALID_USER.GetHashCode(), ErrorCodesRepository.GetErrorDescription(ErrorCodesRepository.EnumUserLoginErrors.UL_INVALID_USER.ToString()));
        }
    }

当我解密令牌时,我得到的值是栀搀愀愀愀愀栀愀愀<<碗。不确定我在做什么,以及为什么它在API 26+之后开始发生。相同的代码适用于较低的API版本。

任何帮助或指示都将不胜感激。

0 个答案:

没有答案