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);
}
目录
相关文章
|
23天前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
173 43
|
3天前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
|
6天前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
20天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
40 8
|
22天前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
44 3
|
21天前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
36 1
|
23天前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
49 1
|
24天前
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
30 2
|
2月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
2月前
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
43 4