AES/CBC/PKCS7Padding加密算法(C版+Java版)(下)

简介: 笔记

三、算法代码实现


1、AES算法代码实现在Java版本中使用的是JDK自带的算法,描述了如何使用JDK的算法。

2、C语言版本是完整的算法代码,相较于引用openssl等体积小,移植也较为方便

3、针对经常涉及的Andriod开发,也给出了Java/Kotlin调用方法以及C语言版本的JNI调用示例


Java版本实现AES算法

Java/Kotlin版本在Java开发和安卓开发中只有Base64的编码和解码API有些差别,其它是相同的。


Java实现

public class AesUtil {
    private static String AES_MODE = "AES/CBC/PKCS7Padding";
    private static String CIPHER = "AES";
    private static String CHARSET = "UTF-8";
    private static byte[] IV_BYTES = "efghefghefghefgh".getBytes();
    private static SecretKeySpec generateKey(byte[] password) {
        return new SecretKeySpec(password, CIPHER);
    }
    public static String encrypt(byte[] password, String message) throws Exception {
        try {
            SecretKeySpec key = generateKey(password);
            byte[] cipherText = encrypt(key, IV_BYTES, message.getBytes());
            return new String(Base64.encode(cipherText, Base64.NO_WRAP));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static byte[] encrypt(SecretKeySpec key, byte[] iv, byte[] message) throws Exception {
        Cipher cipher = Cipher.getInstance(AES_MODE, "BC");
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
        return cipher.doFinal(message);
    }
    public static String decrypt(byte[] password,String  base64EncodedCipherText) throws Exception{
        try {
            SecretKeySpec key = generateKey(password);
            byte[] decodedCipherText = Base64.decode(base64EncodedCipherText.getBytes(), Base64.NO_WRAP);
            byte[] decryptedBytes = decrypt(key, IV_BYTES, decodedCipherText);
            return new String(decryptedBytes);
        } catch (Exception e) {
             e.printStackTrace();
        }
        return null;
    }
    private static byte[] decrypt(SecretKeySpec key,byte[] iv,byte[] decodedCipherText) throws Exception{
        Cipher cipher = Cipher.getInstance(AES_MODE);
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
        return cipher.doFinal(decodedCipherText);
    }
}
//测试
    public void testAESJava() throws Exception {
        System.out.println("测试AES Java版本");
        byte[] password = {'a', 'b', 'c', 'd',
                'a', 'b', 'c', 'd',
                'a', 'b', 'c', 'd',
                'a', 'b', 'c', 'd',};
        System.out.println("密码字符串形式:" + new String(password));
        String encrypt = AesUtil.encrypt(password, "[35380100360174,89860321249940031491,202109301322170001,DEVICE_LOGIN,3,20210930132217,12,8@1@1@0@1@21]");
        System.out.println("AES加密结果:" + encrypt);
        String decrypt = AesUtil.decrypt(password, encrypt);
        System.out.println("AES解密结果:" + decrypt);
    }


Kotlin版本

object AesCryptUtil {
    private const val AES_MODE = "AES/CBC/PKCS7Padding"
    private const val CHARSET = "UTF-8"
    private const val CIPHER = "AES"
    private const val HASH_ALGORITHM = "SHA-256"
    private val IV_BYTES = byteArrayOf('e'.toByte(), 'f'.toByte(), 'g'.toByte(), 'h'.toByte(),
            'e'.toByte(), 'f'.toByte(), 'g'.toByte(), 'h'.toByte(),
            'e'.toByte(), 'f'.toByte(), 'g'.toByte(), 'h'.toByte(),
            'e'.toByte(), 'f'.toByte(), 'g'.toByte(), 'h'.toByte()
    )
    @Throws(NoSuchAlgorithmException::class, UnsupportedEncodingException::class)
    private fun generateKey(password: ByteArray): SecretKeySpec {
        return SecretKeySpec(password, CIPHER)
    }
    @Throws(GeneralSecurityException::class)
    fun encrypt(password: String, message: String): String {
        try {
            val key = generateKey(password)
            val cipherText = encrypt(key, IV_BYTES, message.toByteArray(charset(CHARSET)))
            //NO_WRAP is important as was getting \n at the end
            return Base64Utils.encodeToString(cipherText)
        } catch (e: UnsupportedEncodingException) {
            throw GeneralSecurityException(e)
        }
    }
    @Throws(GeneralSecurityException::class)
    fun encrypt(password: ByteArray, message: String): String {
        try {
            val key = generateKey(password)
            val cipherText = encrypt(key, IV_BYTES, message.toByteArray())
//            DDLog.info("cipherText=${cipherText.contentToString()}")
            for (b in cipherText) {
                val st = String.format("%02X", b)
            }
            //NO_WRAP is important as was getting \n at the end
            return String(Base64Utils.encode(cipherText))
        } catch (e: UnsupportedEncodingException) {
            throw GeneralSecurityException(e)
        }
    }
    @Throws(GeneralSecurityException::class)
    fun encrypt(key: SecretKeySpec, iv: ByteArray, message: ByteArray): ByteArray {
        val cipher = Cipher.getInstance(AES_MODE, "BC")
        val ivSpec = IvParameterSpec(iv)
        cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec)
        return cipher.doFinal(message)
    }
    @Throws(GeneralSecurityException::class)
    fun decrypt(password: String, base64EncodedCipherText: String): String {
        try {
            val key = generateKey(password)
            val decodedCipherText = Base64Utils.decode(base64EncodedCipherText.toByteArray())
            val decryptedBytes = decrypt(key, IV_BYTES, decodedCipherText)
            return String(decryptedBytes, charset(CHARSET))
        } catch (e: UnsupportedEncodingException) {
            throw GeneralSecurityException(e)
        }
    }
    @Throws(GeneralSecurityException::class)
    fun decrypt(password: ByteArray, base64EncodedCipherText: String): String {
        try {
            val key = generateKey(password)
            val decodedCipherText = Base64Utils.decode(base64EncodedCipherText.toByteArray())
            val decryptedBytes = decrypt(key, IV_BYTES, decodedCipherText)
            return String(decryptedBytes, charset(CHARSET))
        } catch (e: UnsupportedEncodingException) {
            throw GeneralSecurityException(e)
        }
    }
    @Throws(GeneralSecurityException::class)
    fun decrypt(key: SecretKeySpec, iv: ByteArray, decodedCipherText: ByteArray): ByteArray {
        val cipher = Cipher.getInstance(AES_MODE)
        val ivSpec = IvParameterSpec(iv)
        cipher.init(Cipher.DECRYPT_MODE, key, ivSpec)
        return cipher.doFinal(decodedCipherText)
    }
}


C/C++语言实现AES算法

C语言实现的AES算法,在windows的实现,更多代码请下载:

int testAESCBC_Smartcard() {
    std::string skey = "abcdabcdabcdabcd";
    std::string siv = "efghefghefghefgh";
    std::string pwd = "[35380100360174,89860321249940031491,202109301322170001,DEVICE_LOGIN,3,20210930132217,12,8@1@1@0@1@21]";
    std::string encryptedText = aes::encrypt_cbc(pwd, skey, siv);
    std::cout << encryptedText << std::endl;
    pwd = aes::decrypt_cbc(encryptedText, skey, siv);
    std::cout << pwd << std::endl;
    return 0;
}

C语言版本的JNI实现:

public class AESHelper {
    static {
        System.loadLibrary("FlyNative");
    }
    public native static String helloJNI();
    public native static String encodeAESCBC(String key, String iv, String message);
    public native static String decodeAESCBC(String key, String iv, String encodedText);
}

JNIEXPORT jstring JNICALL Java_com_flyscale_testaes_AESHelper_encodeAESCBC
        (JNIEnv *jniEnv, jclass clazz, jstring key, jstring iv, jstring msg){
    std::string encodedText = AESUtil::encryptAESCBC(JavaStringToString(jniEnv, key),
                          JavaStringToString(jniEnv, iv),
                          JavaStringToString(jniEnv, msg));
    return StringToJavaString(jniEnv, encodedText);
}
JNIEXPORT jstring JNICALL Java_com_flyscale_testaes_AESHelper_decodeAESCBC
        (JNIEnv *jniEnv, jclass clazz, jstring key, jstring iv, jstring msg){
    std::string decodedText = AESUtil::decryptAESCBC(JavaStringToString(jniEnv, key),
                                                     JavaStringToString(jniEnv, iv),
                                                     JavaStringToString(jniEnv, msg));
    return StringToJavaString(jniEnv, decodedText);
}
目录
相关文章
|
2月前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
84 15
|
4月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
125 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
20 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
11天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
24天前
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
|
25天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
65 16
|
1月前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
65 32
|
1月前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
28天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
58 6
|
28天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
47 5

热门文章

最新文章