Android AES加密解密 CTR 模式

最近在搞AES加密 默认的一般是CBC模式,偏偏公司要用CTR模式,现总结如下,便于以后遇到使用

package com.example.administrator.shanghaijk.utils;
import org.apache.shiro.codec.Hex;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
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;
/**
 * Created by Jane on 2018/8/8.
 * AES CRT加密模式工具类
 */
public class AESCrtUtils {
    /*
     * AES CRT加密
     * @param content 要加密的内容
     * @param key     加密文件的秘钥
     * @param iv      加密的偏移量
     * @return  输出Hex十六进制再次加密的结果
     **/
    public static String encrypt(String content, String key, String iv) {
        String encodeStr = "";
        try {
            //产生密钥
            byte[] keyBytes = key.getBytes();
            //构建SecretKeySpec,初始化Cipher对象时需要该参数
            SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
            //构建Cipher对象,需要传入一个字符串,格式必须为"algorithm/mode/padding"或者"algorithm/",意为"算法/加密模式/填充方式"
            Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
            //初始化Cipher对象
            byte[] ivBytes = iv.getBytes();
            IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            //加密数据
            byte[] resultBytes = cipher.doFinal(content.getBytes());
            //结果用Hex十六进制转码
            encodeStr = new String(Hex.encode(resultBytes));
            return encodeStr;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        return encodeStr;
    }

    /**
     * AES CTR 解密
     *
     * @param encode 加密过后的文件
     * @param iv     偏移量
     * @param key    秘钥文件
     */
    public static String decrypt(String encode, String iv, String key) {
        String decoded = "";
        try {
            byte[] bytes = Hex.decode(encode);
            IvParameterSpec ivSpec = new IvParameterSpec(
                    iv.toString().getBytes());
            Key keys = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, keys, ivSpec);
            byte[] ret = cipher.doFinal(bytes);
            decoded = new String(ret);
            return decoded.trim();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return decoded;
    }
}

 需要用的工具类 shiro-core-1.2.2.jar 下载地址 自行下载即可。。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用MATLAB实现AES加密解密算法的示例代码: ```matlab % AES加密解密算法示例代码 密钥长度为128位,分组长度为128位 % 明文和密文均为16字节长度的字符串 % 加密函数 function ciphertext = aes_encrypt(plaintext, key) % 将明文和密钥转换为字节数组 plaintext_bytes = uint8(plaintext); key_bytes = uint8(key); % 创建AES加密器对象 aes_enc = aes_ctr(key_bytes, 'BlockSize', 16); % 加密明文 ciphertext_bytes = step(aes_enc, plaintext_bytes); % 将密文转换为字符串 ciphertext = char(ciphertext_bytes)'; end % 解密函数 function plaintext = aes_decrypt(ciphertext, key) % 将密文和密钥转换为字节数组 ciphertext_bytes = uint8(ciphertext); key_bytes = uint8(key); % 创建AES解密器对象 aes_dec = aes_ctr(key_bytes, 'BlockSize', 16); % 解密密文 plaintext_bytes = step(aes_dec, ciphertext_bytes); % 将明文转换为字符串 plaintext = char(plaintext_bytes)'; end % 示例代码 plaintext = 'Hello, AES!'; key = '0123456789abcdef'; ciphertext = aes_encrypt(plaintext, key); disp(['明文:', plaintext]); disp(['密钥:', key]); disp(['密文:', ciphertext]); disp(['解密后的明文:', aes_decrypt(ciphertext, key)]); ``` 该示例代码实现了AES加密解密算法,使用了MATLAB内置的AES加密器对象和AES解密器对象。其中,加密函数`aes_encrypt`接受明文和密钥作为输入,返回密文;解密函数`aes_decrypt`接受密文和密钥作为输入,返回明文。示例代码还演示了如何使用这两个函数进行加密解密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值