-
PHP是否支持加密文件上传?
PHP支持加密文件上传PHP通过使用SSL/TLS协议,可以对文件上传进行加密保护,确保文件在传输过程中不会被窃取或篡改。在PHP中,可以使用cURL库来实现文件上传加密。cURL库是一个开源的网络库,支持多种协议,包括HTTP、HTTPS、FTP等。使用cURL库进行加密文件上传的步骤如下:创建cURL句柄。设置cURL选项,包括上传文件的目标URL、要上传的文件路径、SSL选项等。执行cURL句柄。关闭cURL句柄。以下是一个使用cURL库进行加密文件上传的示例代码:
-
PHP如何实现数据加密和解密?
PHP数据加密和解密PHP提供了多种加密解密算法,包括对称加密算法和非对称加密算法。对称加密算法对称加密算法使用同一个密钥进行加密和解密,常用的对称加密算法有DES、3DES、AES等。以下是使用AES算法对数据进行加密和解密的示例代码:php//加密函数functionencrypt($data,$key){$iv=openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));$encrypted=openssl_encrypt($data,'aes-256-cbc',$key,OPENSSL_RAW_DATA,$iv);returnbase64_encode($iv.$encrypted);}//解密函数functiondecrypt($data,$key){$data=base64_decode($data);$iv=substr($data,0,openssl_cipher_iv_length('aes-256-cbc'));$encrypted=substr($data,openssl_cipher_iv_length('aes-256-cbc'));returnopenssl_decrypt($encrypted,'aes-256-cbc',$key,OPENSSL_RAW_DATA,$iv);}//使用示例$data='Hello,world!';$key='my_secret_key';$encrypted_data=encrypt($data,$key);echo"加密后的数据:$encrypted_data\n";$decrypted_data=decrypt($encrypted_data,$key);echo"解密后的数据:$decrypted_data\n";非对称加密算法非对称加密算法使用一对密钥进行加密和解密,其中一个是公钥,用于加密数据,另一个是私钥,用于解密数据。常用的非对称加密算法有RSA、DSA等。以下是使用RSA算法对数据进行加密和解密的示例代码:php//生成密钥对$key_pair=openssl_pkey_new(array('private_key_bits'=>2048,'private_key_type'=>OPENSSL_KEYTYPE_RSA));openssl_pkey_export($key_pair,$private_key);$public_key=openssl_pkey_get_details($key_pair)['key'];//加密函数functionencrypt($data,$public_key){openssl_public_encrypt($data,$encrypted,$public_key);returnbase64_encode($encrypted);}//解密函数functiondecrypt($data,$private_key){$data=base64_decode($data);openssl_private_decrypt($data,$decrypted,$private_key);return$decrypted;}//使用示例$data='Hello,world!';$encrypted_data=encrypt($data,$public_key);echo"加密后的数据:$encrypted_data\n";$decrypted_data=decrypt($encrypted_data,$private_key);echo"解密后的数据:$decrypted_data\n";需要注意的是,使用非对称加密算法加密数据的速度较慢,一般用于加密较小的数据或者用于数据签名。
-
如何使用PHP进行数据加密和解密?
使用PHP进行数据加密和解密PHP提供了多种加密算法来保护敏感数据,比如密码、信用卡号、社会安全号等。下面介绍如何使用PHP进行数据加密和解密。PHP加密函数PHP提供了多种加密函数,包括对称加密和非对称加密。对称加密对称加密是指使用相同的密钥进行加密和解密。常见的对称加密算法有AES、DES、3DES等。下面是使用AES算法进行加密和解密的示例://加密functionencrypt($data,$key){$cipher="aes-128-cbc";$ivlen=openssl_cipher_iv_length($cipher);$iv=openssl_random_pseudo_bytes($ivlen);$ciphertext=openssl_encrypt($data,$cipher,$key,OPENSSL_RAW_DATA,$iv);returnbase64_encode($iv.$ciphertext);}//解密functiondecrypt($data,$key){$cipher="aes-128-cbc";$data=base64_decode($data);$ivlen=openssl_cipher_iv_length($cipher);$iv=substr($data,0,$ivlen);$ciphertext=substr($data,$ivlen);returnopenssl_decrypt($ciphertext,$cipher,$key,OPENSSL_RAW_DATA,$iv);}在上面的示例中,我们使用了AES-128-CBC算法进行加密和解密。其中,$data是要加密的数据,$key是密钥。非对称加密非对称加密是指使用不同的密钥进行加密和解密。常见的非对称加密算法有RSA、DSA等。下面是使用RSA算法进行加密和解密的示例://生成密钥对$res=openssl_pkey_new(array("private_key_bits"=>2048,"private_key_type"=>OPENSSL_KEYTYPE_RSA,));openssl_pkey_export($res,$private_key);$public_key=openssl_pkey_get_details($res)["key"];//加密functionencrypt($data,$public_key){openssl_public_encrypt($data,$encrypted,$public_key);returnbase64_encode($encrypted);}//解密functiondecrypt($data,$private_key){$data=base64_decode($data);openssl_private_decrypt($data,$decrypted,$private_key);return$decrypted;}在上面的示例中,我们使用了RSA算法进行加密和解密。首先使用openssl_pkey_new()函数生成密钥对,然后使用openssl_public_encrypt()函数进行加密,使用openssl_private_decrypt()函数进行解密。总结PHP提供了多种加密算法来保护敏感数据。在使用加密算法时,一定要注意密钥的保护,不要将密钥存储在明文文件中,最好使用加密算法保护密钥。
-
如何使用PHP进行加密和解密?
使用PHP进行加密和解密PHP提供了多种加密和解密的函数,常用的有md5、sha1、base64和openssl等。以下是简单介绍:使用md5进行加密md5算法是一种单向加密算法,可以将任意长度的数据加密成一个128位的哈希值,不可逆。$password='123456';$encrypted_password=md5($password);echo$encrypted_password;输出结果为:e10adc3949ba59abbe56e057f20f883e使用sha1进行加密sha1算法也是一种单向加密算法,可以将任意长度的数据加密成一个160位的哈希值,不可逆。$password='123456';$encrypted_password=sha1($password);echo$encrypted_password;输出结果为:7c4a8d09ca3762af61e59520943dc26494f8941b使用base64进行加密和解密base64是一种编码方式,可以将二进制数据编码成可打印的ASCII字符,常用于在网络传输中传递二进制数据。base64编码不是加密,但可以用于加密。使用base64进行加密:$data='helloworld';$encrypted_data=base64_encode($data);echo$encrypted_data;输出结果为:aGVsbG8gd29ybGQ=使用base64进行解密:$encrypted_data='aGVsbG8gd29ybGQ=';$data=base64_decode($encrypted_data);echo$data;输出结果为:helloworld使用openssl进行加密和解密openssl是一个开源的加密库,提供了多种加密和解密算法,包括对称加密和非对称加密。以下是使用openssl进行对称加密和解密的示例:使用openssl进行对称加密:$data='helloworld';$key='1234567890';$cipher='aes-128-cbc';$ivlen=openssl_cipher_iv_length($cipher);$iv=openssl_random_pseudo_bytes($ivlen);$encrypted_data=openssl_encrypt($data,$cipher,$key,0,$iv);echo$encrypted_data;输出结果为:3rJtVYhQ2yW0JGx0zRdCwA==使用openssl进行对称解密:$encrypted_data='3rJtVYhQ2yW0JGx0zRdCwA==';$key='1234567890';$cipher='aes-128-cbc';$ivlen=openssl_cipher_iv_length($cipher);$iv=openssl_random_pseudo_bytes($ivlen);$data=openssl_decrypt($encrypted_data,$cipher,$key,0,$iv);echo$data;输出结果为:helloworld
-
一个
如何在程序中实现数据加密和解密的功能?
数据加密和解密数据加密和解密是信息安全领域的重要技术,其中加密是将明文转换为密文的过程,解密则是将密文转换回明文的过程。在程序开发中,实现数据加密和解密功能可以保护用户数据的安全性,防止数据被恶意篡改或窃取。常见的加密算法常见的加密算法包括对称加密算法和非对称加密算法。对称加密算法使用同一个密钥进行加密和解密,常见的对称加密算法有DES、3DES、AES等;非对称加密算法使用一对密钥进行加密和解密,常见的非对称加密算法有RSA、DSA等。实现数据加密和解密的步骤实现数据加密和解密的步骤如下:选择合适的加密算法,确定加密和解密的密钥将明文转换为二进制格式使用加密算法对二进制数据进行加密将加密后的数据转换为十六进制格式,以便存储和传输接收到密文后,将其转换为二进制格式使用解密算法对二进制数据进行解密将解密后的数据转换为明文格式常见的加密库为了方便程序开发,常见的编程语言都提供了加密库,可以直接调用加密函数实现数据加密和解密功能。例如:Java:javax.crypto包中提供了加密算法实现C#:System.Security.Cryptography命名空间中提供了加密算法实现Python:pycrypto、cryptography等第三方库提供了加密算法实现C++:OpenSSL库提供了加密算法实现
-
如何在代码中实现数据加密和解密?
数据加密和解密数据加密是指将明文转化为密文的过程,以保证数据在传输或存储过程中不被非法获取或篡改。常见的加密算法有对称加密和非对称加密。对称加密是指加密和解密使用同一把密钥的加密方式,常见的对称加密算法有DES、AES等。非对称加密是指加密和解密使用不同密钥的加密方式,常见的非对称加密算法有RSA、DSA等。解密就是将密文转化为明文的过程,只有知道密钥的人才能够解密。在代码中实现数据加密和解密,可以使用各种编程语言自带的加密库或第三方加密库。以Python为例:Python实现数据加密和解密Python自带的加密库有hashlib、hmac等,还可以使用第三方库pycrypto、pycryptodome等。对称加密的实现:importhashlibimportbase64fromCrypto.CipherimportAESkey=hashlib.sha256(b'mykey').digest()iv=b'myiv'defencrypt(message):message=message.encode()cipher=AES.new(key,AES.MODE_CFB,iv)ciphertext=cipher.encrypt(message)returnbase64.b64encode(ciphertext).decode()defdecrypt(ciphertext):ciphertext=base64.b64decode(ciphertext.encode())cipher=AES.new(key,AES.MODE_CFB,iv)message=cipher.decrypt(ciphertext)returnmessage.decode()非对称加密的实现:fromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_OAEPprivate_key=RSA.generate(2048)public_key=private_key.publickey()defencrypt(message):message=message.encode()cipher=PKCS1_OAEP.new(public_key)ciphertext=cipher.encrypt(message)returnciphertext.hex()defdecrypt(ciphertext):ciphertext=bytes.fromhex(ciphertext)cipher=PKCS1_OAEP.new(private_key)message=cipher.decrypt(ciphertext)returnmessage.decode()上述代码仅为示例,实际应用中需要根据具体需求进行调整和优化。
-
如何在程序中实现数据的加密和解密?
对称加密和非对称加密在程序中实现数据的加密和解密,一般可以采用对称加密和非对称加密两种方式。对称加密对称加密是指加密和解密使用同一个密钥的加密方式。常见的对称加密算法有DES、3DES、AES等。对称加密的优点是加解密速度快,适用于大数据量的加密。但是密钥需要在加解密双方之间共享,如果密钥被泄露,数据就会暴露。非对称加密非对称加密是指加密和解密使用不同密钥的加密方式。常见的非对称加密算法有RSA、DSA等。非对称加密的优点是密钥不需要共享,可以通过公钥加密、私钥解密的方式保证数据的安全性。但是非对称加密的加解密速度相对较慢。加密和解密的实现在程序中实现数据的加密和解密,可以使用加密库或者加密算法实现。常见的加密库有OpenSSL、BouncyCastle等,它们提供了丰富的加密算法和API,可以方便地实现数据的加密和解密。如果需要自己实现加密算法,可以参考相关的加密标准和算法,例如AES加密标准、RSA加密算法等。加密和解密的实现一般包括以下几个步骤:生成密钥加密数据解密数据其中,密钥的生成可以使用随机数生成器或者特定的算法生成。加密数据和解密数据的过程中,需要使用生成的密钥进行加解密操作。
-
如何在程序中实现数据加密和解密?
数据加密和解密的实现在程序中实现数据加密和解密可以保护数据的安全性,防止数据被非法获取或篡改。常用的加密算法包括对称加密算法和非对称加密算法。对称加密算法对称加密算法指加密和解密使用相同密钥的加密算法,常用的对称加密算法有DES、3DES、AES等。对称加密的过程如下:将明文按照一定的规则进行分组对每个分组进行相同的加密操作,使用相同的密钥将加密后的密文组合起来对称加密的弊端是密钥的传输和管理比较困难,容易被攻击者截获。非对称加密算法非对称加密算法指加密和解密使用不同密钥的加密算法,常用的非对称加密算法有RSA、DSA等。非对称加密的过程如下:生成一对密钥,包括公钥和私钥将明文使用公钥加密得到密文使用私钥解密密文得到明文非对称加密的优点是密钥管理方便,但加解密的过程比对称加密算法要复杂,耗时较长。其他技术除了对称加密算法和非对称加密算法外,还有哈希算法、数字签名等技术可以保证数据的安全性。哈希算法是指将任意长度的消息压缩到一个固定长度的消息摘要的过程,常用的哈希算法有MD5、SHA-1等。数字签名是指将消息进行哈希计算,然后用私钥对哈希值进行加密的过程,常用的数字签名算法有RSA数字签名算法、DSA数字签名算法等。使用这些技术,可以保证数据的完整性、机密性和可靠性。
-
如何在程序中实现数据的加密和解密?
数据加密和解密数据加密是指将明文数据通过加密算法转换成密文数据的过程,目的是为了保护数据的机密性。数据解密则是将密文数据通过解密算法转换成明文数据的过程。在程序中实现数据加密和解密,可以通过调用加密算法库或者自己编写加密算法来实现。常用的加密算法常用的加密算法有对称加密算法和非对称加密算法。对称加密算法指加密和解密使用同一种密钥的加密算法,如DES、AES等。非对称加密算法指加密和解密使用不同密钥的加密算法,如RSA、ECC等。加密和解密过程加密和解密过程一般包括以下步骤:生成密钥:根据加密算法生成密钥。加密数据:将明文数据使用生成的密钥进行加密。解密数据:将密文数据使用生成的密钥进行解密。加密和解密在程序中的实现在程序中实现数据加密和解密,可以使用现成的加密算法库,如OpenSSL、BouncyCastle等,也可以自己编写加密算法。使用加密算法库可以大大简化开发工作,提高开发效率和安全性。自己编写加密算法需要对加密算法有深入的了解,需要考虑算法的安全性和效率。总结数据加密和解密是保护数据安全的重要手段,程序中实现数据加密和解密可以使用现成的加密算法库或者自己编写加密算法。在选择加密算法时需要考虑安全性和效率。使用现成的加密算法库可以提高开发效率和安全性。
-
AES加密详解
文章目录推荐AES简介对称加密加密模式填充模式常见填充模式PKCS5Padding到底是什么?偏移量字符集实际工作中的加密流程AES加密/解密注意的问题实战AES加解密AES默认实现类AES随机加密推荐AES加密—详解RSA加密—详解AES简介DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS)AES密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(DataEncryptionStandard),已经被多方分析且广为全世界所使用。为什么DES被废弃?我们知道数据加密标准(DataEncryptionStandard:DES)的密钥长度是56比特,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,DES将不能提供足够的安全性。简单来说,DES标准的秘钥长度要求太短,安全性不够。为什么AES算法被称为Rijndael算法?1997年1月2号,美国国家标准技术研究所(NationalInstituteofStandardsandTechnology:NIST)宣布希望征集高级加密标准(AdvancedEncryptionStandard:AES)[3],用以取代DES。AES得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS,下图分别为其中的5位作者。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。为什么AES算法安全性高?AES的区块长度固定为128位,密钥长度则可以是128bit,192bit或256位bit。换算成字节长度,就是密码必须是16个字节,24个字节,32个字节。AES密码的长度更长了,破解难度就增大了,所以就更安全。对称加密对称加密:也就是加密秘钥和解密秘钥是一样的。非对称加密:也就是加密秘钥和解密秘钥是不一样的。AES是对称加密算法,优点:加密速度快;缺点:如果秘钥丢失,就容易解密密文,安全性相对比较差RSA是非对称加密算法,优点:安全;缺点:加密速度慢AES加密需要:明文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES解密需要:密文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES的算法模式一般为AES/CBC/PKCS5Padding加密模式AES的加密模式有以下几种电码本模式(ECB)密码分组链接模式(CBC)计算器模式(CTR)密码反馈模式(CFB)输出反馈模式(OFB)密码分组链接模式(CBC):将整段明文切成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。电码本模式ECB(Electroniccodebook,ECB):需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。根据图示,在CBC模式下,使用AES加解密方式进行分组加解密时,需要用到的两个参数1、初始化向量,也就是偏移量2、加解密秘钥填充模式如电子密码本(ECB)和密文块链接(CBC)。为对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍,因此信息必须填充至满足要求。常见填充模式算法/模式/填充16字节加密后数据长度不满16字节加密后长度AES/CBC/NoPadding16不支持AES/CBC/PKCS5Padding3216AES/CBC/ISO10126Padding3216AES/CFB/NoPadding16原始数据长度AES/CFB/PKCS5Padding3216AES/CFB/ISO10126Padding3216AES/ECB/NoPadding16不支持AES/ECB/PKCS5Padding3216AES/ECB/ISO10126Padding3216AES/OFB/NoPadding16不支持AES/OFB/PKCS5Padding3216AES/OFB/ISO10126Padding3216AES/PCBC/NoPadding16不支持AES/PCBC/PKCS5Padding3216AES/PCBC/ISO10126Padding3216PKCS5Padding到底是什么?为什么JAVA里指定算法时,写的是AES/CBC/PKCS5Padding,每个都是什么含义,又有什么作用。AES,加解密算法CBC,数据分组模式PKCS5Padding,数据按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐,也可以叫补齐模式简单的说:拿到一个原始数据以后,首先需要对数据进行分组,分组以后如果长度不满足分组条件,需要进行补齐,最后形成多个分组,在使用加解密算法,对这多个分组进行加解密。所以这个过程中,AES,CBC,PKCS5Padding缺一不可。在对数据进行加解密时,通常将数据按照固定的大小(blocksize)分成多个组,那么随之就产生了一个问题,如果分到最后一组,不够一个blocksize了,要怎么办?此时就需要进行补齐操作。补齐规则:Thevalueofeachaddedbyteisthenumberofbytesthatareadded,i.e.Nbytes,eachofvalueNareadded.举例:36位的UUID,如果按照blocksize=16字节(即128比特),那么就需要补齐到48位,差12个字节。那么最后填充的12个字节的内容,都是字节表示的0x0c(即12)。偏移量偏移量的添加一般是为了增加AES加密的复杂度,增加数据的安全性。一般在AES_256中会使用到偏移量,而在AES_128加密中不会使用到。字符集在AES加密中,特别也要注意到字符集的问题。一般用到的字符集是utf-8和gbk。实际工作中的加密流程在实际的工作中,客户端跟服务器交互一般都是字符串格式,所以一个比较好的加密流程是:加密流程:明文通过密钥(有时也需要偏移量),利用AES加密算法,然后通过Base64转码,最后生成加密后的字符串。解密流程:加密后的字符串通过密钥(有时也需要偏移量),利用AES解密算法,然后通过Base64转码,最后生成解密后的字符串。AES加密/解密注意的问题AES加密/解密的时候,通常是用在服务端和客户端通讯的过程中,一端加密传输,另一端解密使用。虽然AES加密看似简单,但在使用过程过程中,仍然会出现在一端加密ok,但是另一端解密失败的情况。一旦出现AES解密失败,我们可以通过以下几个方面进行排查:1. AES 加密/解密 使用相同的密钥2. 若涉及到偏移量,则AES 加密/解密 使用的偏移量要一样3. AES 加密/解密 要使用相同加密数位,如都使用`AES_256`4. AES 加密/解密 使用相同的字符集5. AES 加密/解密 使用相同的加密,填充模式,如都使用`AES/CBC/PKCS5Padding`模式6. 由于不同开发语言(如C 和 Java)及不同开发环境(如 Java 和 Android)的影响,可能相同的加解密算法在实现上出现差异,若你们注意到这个差异,就可能导致加解密出现问题123456最后,当我们需要验证自己的AES解密算法是否与别人的加密方法为一套的时候。可以让加密方发你一份加密后的密文和加密前的明文,然后你用密文解密,看解密结果和加密方发你的是否一致。需要注意的是,加密方给你的明文要尽量简洁,如就中国二字,这样既能看出加密方和解密方的字符集是否一致,而且能避免复制粘贴等环节出现空格,回车等转义字符对验证结果的干扰。实战AES加解密首先定义加密、解密工具类import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES { /** * AES加密 * * @param key * @param iv * @throws GeneralSecurityException * @throws IOException */ public static byte[] encryptAes(byte[] data, byte[] key, byte[] iv) throws GeneralSecurityException, IOException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); return cipher.doFinal(data); } /** * AES解密 * * @param key * @param iv * @return * @throws GeneralSecurityException * @throws IOException */ public static byte[] decryptAesToByteString(byte[] data, byte[] key, byte[] iv) throws GeneralSecurityException, IOException { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); return cipher.doFinal(data); }}12345678910111213141516171819202122232425262728293031323334353637383940414243加密和解密的代码很像,唯一的不同点是,加密Cipher.ENCRYPT_MODE,解密用的是Cipher.DECRYPT_MODE下面我们写一个测试代码: try { //加密密码 String key = "zhaoyanjunzhaoy1"; //偏移量 String iv = "1234567890123456"; String message = "今天是周二,我好开心"; //加密 byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes(), iv.getBytes()); //解密 byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes(), iv.getBytes()); System.out.println("解密数据 = " + new String(decryResult)); } catch (IOException | GeneralSecurityException e) { e.printStackTrace(); }123456789101112131415161718输出结果:解密数据 = 今天是周二,我好开心1可以看到数据已经正常解密了。AES默认实现类不带模式和填充来获取AES算法的时候,其默认使用AES/ECB/PKCS5Padding(输入可以不是16字节,也不需要填充向量),所以不需要偏移量参数Cipher cipher = Cipher.getInstance("AES");1我下面封装一个工具类import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES { /** * AES加密 * * @param key * @throws GeneralSecurityException */ public static byte[] encryptAes(byte[] data, byte[] key) throws GeneralSecurityException { Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES")); return cipher.doFinal(data); } /** * AES解密 * * @param key * @return * @throws GeneralSecurityException * @throws IOException */ public static byte[] decryptAesToByteString(byte[] data, byte[] key) throws GeneralSecurityException, IOException { Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES")); return cipher.doFinal(data); }}12345678910111213141516171819202122232425262728293031323334353637测试代码public class T2 { public static void main(String[] args) { try { //加密密码 String key = "zhaoyanjunzhaoy1"; //加密正文 String message = "今天是周二,我好开心"; //加密 byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes()); //解密 byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes()); System.out.println("解密数据 = " + new String(decryResult)); } catch (IOException | GeneralSecurityException e) { e.printStackTrace(); } }}12345678910111213141516171819202122测试结果解密数据 = 今天是周二,我好开心1AES随机加密在上面的例子中,我们在AES加密中,需要指定规定长度的密码,偏移量。在Java中还给我们提供了KeyGenerator类来随机生成一个密码和偏移量,解决了我们动脑想密码的问题。我们来看看随机加密怎么用。 /** * AES加密/解密 * * @throws GeneralSecurityException */ public void encryptAes() throws GeneralSecurityException { //原始数据 String message = "今天是周四,好开心哦"; byte[] data = message.getBytes(); //指定加密类型 KeyGenerator keygen = KeyGenerator.getInstance("AES"); //指定秘钥长度 keygen.init(256); SecretKey secretKey = keygen.generateKey(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); //获取秘钥 byte[] key = secretKey.getEncoded(); //获取偏移量 byte[] iv = cipher.getIV(); //解密数据 byte[] ciphertext = cipher.doFinal(data); //解密数据 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); byte[] decryMessage = cipher.doFinal(ciphertext); System.out.println("解密数据 = " + new String(decryMessage)); }123456789101112131415161718192021222324252627282930313233这种加密key,iv都是随机产生的,每次加密后的密文都不一样,适合一定的特殊场景。随机是怎么发生的,我们就看cipher.init(Cipher.ENCRYPT_MODE, secretKey);1在init方法的时候,JceSecurity.RANDOM产生随机数,源码如下: public final void init(int opmode, Key key) throws InvalidKeyException { init(opmode, key, JceSecurity.RANDOM); }123具体细节就不看了,知道原理就行。