Java加密简单了解

最近需要用到AES和rsa加密,学了下Java加密,写了点东西,记录下。
这是简单的字符串加密,文件加密等后面再发。

一、先上代码简单的加解密

1.加密

	 /**
     * base 64 encodes
     * @param bytes 待编码的byte[]
     * @return 编码后的base 64 code
     */
    public static String base64Encode(byte[] bytes) {
     return Base64.encodeBase64String(bytes);
    }

    /**
     * AES加密
     * @param content 待加密的内容
     * @param encryptKey 加密密钥
     * @return 加密后的bytes[]
     * @throws Exception
     */
    public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
        Cipher cipher = Cipher.getInstance(Message.ALGORITHMSTR);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(),"AES"));

        return cipher.doFinal(content.getBytes("utf-8"));
    }

    /**
     * AES加密为base 64 code
     * @param content 待加密的内容
     * @param encryptKey 加密密钥
     * @return 加密后的base 64 code
     * @throws Exception
     */
    public static String aesEncrypt(String content, String encryptKey) throws Exception{
        return base64Encode(aesEncryptToBytes(content, encryptKey));
    }

2.解密

	 /**
     * base 64 decode
     * @param base64Code 待解码的base 64 code
     * @return 解码后的byte[]
     * @throws IOException
     */
    public static byte[] base64Decode(String base64Code) throws IOException {
        return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
    }

    /**
     * AES解密
     * @param encryptBytes 待解密的byte[]
     * @param decryptKey 解密密钥
     * @return 解密后的String
     * @throws Exception
     */
    public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception{

        Cipher cipher = Cipher.getInstance(Message.ALGORITHMSTR);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
        byte[] decryptBytes = cipher.doFinal(encryptBytes);
        return new String(decryptBytes);
    }

    /**
     * 将base 64 code解密
     * @param encryptAtr 待解密的base 64 code
     * @param decryptKey 解密密钥
     * @return解密后的String
     * @throws Exception
     */
    public static String aesDecrypt(String encryptAtr,String decryptKey) throws Exception{
        return StringUtils.isEmpty(encryptAtr) ? null : aesDecryptByBytes(base64Decode(encryptAtr), decryptKey);
    }

3.代码解释

上面简单实现了AES(“AES/ECB/PKCS5Padding”)的加密和解密。可以看到到代码中主要用到的是cipher对象,并有以下调用
(1)新建Cipher对象时需要传入一个参数"AES/ECB/PKCS5Padding"。
(2)cipher对象使用之前还要初始化,共两个参数(“加密模式或者解密模式”,“密钥”)。
(3)调用数据转换:cipher.doFinal(content),其中content是一个byte数组。
实际上Cipher类实现了多种加密算法,在创建Cipher对象时,传入不同的参数就可以进行不同的加密算法,而这些算法不同的地方只是创建密钥的方法不同而已。
如传入"AES/ECB/PKCS5Padding"就可以进行AES加密。传入"DESede/CBC/NoPadding"可以进行DES3加密。
要了解Java自带的加密算法,可以参考JDK文档的附录:点我进入~~~~

二、Java的Cipher类

1.Cipher类提供了加密和解密的功能

常用的使用Cipher类完成AES、DES、DES3和RSA加密。
获取Cipher类的对象:Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”);参数按“算法/模式/填充模式”,有以下参数

  • AES/CBC/NoPadding (128)
  • AES/CBC/PKCS5Padding (128)
  • AES/ECB/NoPadding (128)
  • AES/ECB/PKCS5Padding (128)
  • DES/CBC/NoPadding (56)
  • DES/CBC/PKCS5Padding (56)
  • DES/ECB/NoPadding (56)
  • DES/ECB/PKCS5Padding (56)
  • DESede/CBC/NoPadding (168)
  • DESede/CBC/PKCS5Padding (168)
  • DESede/ECB/NoPadding (168)
  • DESede/ECB/PKCS5Padding (168)
  • RSA/ECB/PKCS1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
    (1)加密算法有:AES、DES、DESede(DES3)和RSA四种
    (2)模式有CBC(有向量模式)和ECB(无向量模式),向量模式可以简单理解为偏移量,使用CBC模式需要定义一个IvParameterSpec对象。
    (3)填充模式:
  • NoPadding:加密内容不足8位用0不足8位,Cipher类不提供补位功能,需要自己实现代码给加密内容添加0,如{1,1,1,0,0,0,0,0}
  • PKCS5Padding:加密内容不足8位用余位数补足8位,如{65,65,65,34,4,4,4,4}刚好8位补齐。

2.Cipher对象需要初始化

init(int opmode, Key key, AlgorithmParameterSpec params)
(1)opmode:Cipher.ENCRYPT_MODE(加密模式)和Cipher.DECRYPT_MODE(解密模式)
(2)key:密钥使用传入的密钥种子构造出一个密钥,可以使用SecretKeySpec、KeyGenerator和KeyPairGenerator创建密钥,其中

  • SecretKeySpec和KeyGenerator支持AES、DES、DESede三种加密算法创建密钥。
  • KeyPairGenerator支持RSA加密创建算法密钥。
    (3)params:使用CBC模式时必须传入该参数,一般使用IvParameterSpec创建iv对象

3.加密或解密

byte[] bytes = cipher.doFinal(content);
返回结果为byte数组,如果直接使用new String(bytes)封装成字符串,则会出现乱码。
一般有两种处理方法:转换为base64的字符串或者转换为16进制的字符串。

3.1转换为base64

使用apache下的Base64类进行封装即可,Base64.encodeBase64String(result)结果就是ZpsMeHzAo7CMtKoi9diExxByn6v这样。

3.2转换为16进制

编码实现,即编码实现将2进制转换为16进制。

/**
 * 16进制工具类
 */
public class HexUtil {
    private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

    /**
     * 十六进制转化为二进制
     */
    public static byte[] hexStrToByteArray(String hexString) {
        if (hexString == null) {
            return null;
        }
        if (hexString.length() == 0) {
            return new byte[0];
        }
        byte[] byteArray = new byte[hexString.length() / 2];
        for (int i = 0; i < byteArray.length; i++) {
            String subStr = hexString.substring(2 * i, 2 * i + 2);
            byteArray[i] = ((byte) Integer.parseInt(subStr, 16));
        }
        return byteArray;
    }

    /**
     * 二进制转化为十六进制
     */
    public static String byteArrayToHexStr(byte[] byteArray) {
        if (byteArray == null) {
            return null;
        }
        char[] hexChars = new char[byteArray.length * 2];
        for (int j = 0; j < byteArray.length; j++) {
            int v = byteArray[j] & 0xFF;
            hexChars[j * 2] = HEX_CHARS[v >>> 4];
            hexChars[j * 2 + 1] = HEX_CHARS[v & 0x0F];
        }
        return new String(hexChars);
    }
}

结果就是04A2784A45234B…这种样子啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以帮你介绍一下Java语言如何实现仿射变换加密和解密。 首先,我们需要了解一下仿射变换的概念。仿射变换是指在平面上进行的一种变形,包括平移、旋转、缩放和剪切操作。在加密和解密中,我们通常会使用仿射变换来对明文进行加密,同时使用逆变换对密文进行解密。 下面是一个简单Java代码示例,用于实现仿射变换的加密和解密: ```java import java.util.Scanner; public class AffineCipher { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the plain text: "); String plainText = sc.nextLine(); System.out.println("Enter key a: "); int a = sc.nextInt(); System.out.println("Enter key b: "); int b = sc.nextInt(); String cipherText = encrypt(plainText, a, b); System.out.println("Encrypted text: " + cipherText); String decryptedText = decrypt(cipherText, a, b); System.out.println("Decrypted text: " + decryptedText); } public static String encrypt(String plainText, int a, int b) { String cipherText = ""; for (int i = 0; i < plainText.length(); i++) { char ch = (char) (((a * (plainText.charAt(i) - 'A') + b) % 26) + 'A'); cipherText += ch; } return cipherText; } public static String decrypt(String cipherText, int a, int b) { String plainText = ""; int a_inv = 0; int flag = 0; for (int i = 0; i < 26; i++) { flag = (a * i) % 26; if (flag == 1) { a_inv = i; } } for (int i = 0; i < cipherText.length(); i++) { char ch = (char) (((a_inv * ((cipherText.charAt(i) + 'A' - b)) % 26)) + 'A'); plainText += ch; } return plainText; } } ``` 在这个示例中,我们定义了两个函数:`encrypt()`和`decrypt()`。`encrypt()`函数接收明文、键a和键b作为输入,并返回加密后的密文。`decrypt()`函数接收密文、键a和键b作为输入,并返回解密后的明文。 在`encrypt()`函数中,我们遍历明文中的每个字符,并根据公式 `E(x) = (ax + b) mod 26` 对其进行加密。其中,a和b是键,x是明文字符的数字值,mod 26表示对26取模,最后将加密后的字符拼接成一个字符串,并返回该字符串。 在`decrypt()`函数中,我们首先计算出a的逆元a_inv,然后遍历密文中的每个字符,并根据公式 `D(x) = a^-1(x - b) mod 26` 对其进行解密。其中,a_inv是a的逆元,x是密文字符的数字值,并将解密后的字符拼接成一个字符串,并返回该字符串。 希望这个示例可以帮助你理解Java语言如何实现仿射变换的加密和解密。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值