AES 256 算法支持

问题描述 投票:0回答:2

是否有安全可靠的 API 允许我在 Android 应用程序中使用 AES-256 算法?

我使用 JDK 9 的

javax.crypto
java.security
类编写了一个简单的 API,提供对 AES-256 的支持。 因为Android仍然停留在JDK 7(JDK 8不支持AES-256),所以我无法使用这些API。那么,如何使用基于 AES-256 算法的加密呢?

java android algorithm encryption cryptography
2个回答
0
投票

您可以通过以下链接使用 github 上 dealforest 给出的代码: AES256 加密安卓

如果您想更轻松地获取它,我将代码放在下面;)



    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.spec.AlgorithmParameterSpec;

    public class AES256Cipher {

        public static byte[] encrypt(byte[] ivBytes, byte[] keyBytes, byte[] textBytes) 
                throws java.io.UnsupportedEncodingException, 
                    NoSuchAlgorithmException,
                    NoSuchPaddingException,
                    InvalidKeyException,
                    InvalidAlgorithmParameterException,
                    IllegalBlockSizeException,
                    BadPaddingException {

            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
            SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES");
            Cipher cipher = null;
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
            return cipher.doFinal(textBytes);
        }

        public static byte[] decrypt(byte[] ivBytes, byte[] keyBytes, byte[] textBytes) 
                throws java.io.UnsupportedEncodingException, 
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                InvalidAlgorithmParameterException,
                IllegalBlockSizeException,
                BadPaddingException {

            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
            SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
            return cipher.doFinal(textBytes);
        }
    }

以下是如何使用该类:



    String key = "e8ffc7e56311679f12b6fc91aa77a5eb";
    byte[] keyBytes = key.getBytes("UTF-8");
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

    String plainText;
    byte[] cipherData;
    String base64Text;

    //############## Request(crypt) ##############
    plainText  = "crypt text!!";
    cipherData = AES256Cipher.encrypt(ivBytes, keyBytes, plainText.getBytes("UTF-8"));
    base64Text = Base64.encodeToString(cipherData, Base64.DEFAULT);
    Log.d("encrypt", base64Text);

    //############## Response(decrypt) ##############
    base64Text = "72XrlydqnUzVrDfDE7ncnQ==";
    cipherData = AES256Cipher.decrypt(ivBytes, keyBytes, Base64.decode(base64Text.getBytes("UTF-8"), Base64.DEFAULT));
    plainText = new String(cipherData, "UTF-8");
    Log.d("dcrypt", plainText);

我还没有测试过,但我认为代码仍然有效。


0
投票

我很感兴趣,因为你使用了对应于 AES-128 的 16 字节 IV。 AES-256 需要 32 字节 IV。有解释吗?

© www.soinside.com 2019 - 2024. All rights reserved.