目前比较常用的加密算法总结起来就是单向加密和双向加密,其实很简单,也不难理解。不过小鱼觉得还是有必要对其原理有一个清晰的认识,这样在我们的开发中才会得心应手。毕竟对于我们的研发来说,数据安全是第一位的,而加密算法对于维护软件数据安全有着举足轻重的作用。下面就跟着小鱼一起来看看这些算法用在什么地方,怎么用,代码是怎么实现的。慢慢看完,你会对这些小密码有更深的理解。前言今天给大家带来的是加密算法的来世与今生。其实早在古希腊时期,人类就发明了置换密码。到1881年,世界上第一个电话安全专利出现了。二战期间,德国军方使用了“Enigma”密码机,密码学在战争中发挥了非常重要的作用。1997年,美国国家标准局宣布实施“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用。使用的加密算法有DES、RSA、SHA等,随着对加密强度的要求越来越高,最近又出现了AES、ECC等。好了,历史说完了,该进入正文了,让我们来看看使用加密算法对我们有什么好处。密码学用于以下目的:机密性:防止用户的身份或数据被读取。数据完整性:防止数据被更改。身份验证:确保数据来自特定方。单向加密通俗地说,就是对数据进行摘要计算生成密文,密文可以不可逆地推导和还原。算法代表:MD5、SHA、HMAC等单向加密MD5MD5——message-digestalgorithm5(信息-摘要算法)的缩写,广泛应用于加解密技术,常用于文件验证。不管文件有多大,MD5后都可以生成唯一的MD5值。比如现在的ISO校验都是MD5校验,MD5值是ISO通过MD5后生成的。一般下载linux-ISO的朋友都在下载链接旁边看到过MD5字符串。用于校验文件是否一致。加密工具如下:/***MD5encryption**@paramdata*@return*@throwsException*/publicstaticbyte[]encryptMD5(byte[]data)throwsException{MessageDigestmd5=MessageDigest.getInstance(KEY_MD5);md5.update(data);returnmd5.digest();}SHASHA(SecureHashAlgorithm)作为数字签名等密码学应用的重要工具,广泛应用于电子商务等信息安全领域。虽然SHA和MD5都被碰撞法破解,但SHA仍然是公认的安全加密算法,比MD5更安全。加密工具如下:/***SHAencryption**@paramdata*@return*@throwsException*/publicstaticbyte[]encryptSHA(byte[]data)throwsException{MessageDigestsha=MessageDigest.getInstance(KEY_SHA);sha.update(data);returnsha.digest();}}HMACHMAC(HashMessageAuthenticationCode,HashMessageAuthenticationCode,一种基于key-basedHash算法的认证协议。消息认证码实现认证的原理是利用公共函数和keys生成一个固定长度的值作为鉴权标识,用来标识报文的完整性,用一个key生成一个固定大小的小数据块,即MAC,添加到消息,然后传输它。接收方使用与发送方密钥的共享进行身份验证等。加密工具类如下:/***初始化HMAC密钥**@return*@throwsException*/publicstaticStringinitMacKey()throwsException{KeyGeneratorkeyGenerator=KeyGenerator.getInstance(KEY_MAC);SecretKeysecretKey=keyGenerator.generateKey();returnencryptBASE64(secretKey.getEncoded());}/***HMAC加密**@paramdata*@paramkey*@return*@throwsException*/publicstaticbyte[]encryptHMAC(byte[]data,Stringkey)throwsException{SecretKeysecretKey=newSecretKeySpec(decryptBASE64(key),KEY_MAC);Macmac=Mac.getInstance(secretKey.getAlgorithm());mac.init(secretKey);returnmac.doFinal(data);}双向加密双向加密又称可逆加密。逆向解为明文,双向加密分为对称加密和非对称加密。对称加密算法对称加密算法是一种较早的、技术成熟的加密算法。在对称加密算法中,数据发送方将明文(原始数据)和加密密钥结合特殊的加密算法处理,变成复杂的加密密文发送出去。在对称加密算法中,只使用一个密钥,发送方和接收方都使用这个密钥对数据进行加密和解密,这就需要解密方事先知道加密密钥。对称加密算法的特点是8种算法公开,计算量小,加密速度快,加密效率高。缺点是交易双方使用同一个密钥,因此无法保证安全*。对称加密算法很难在分布式网络系统中使用,主要是因为密钥管理困难,使用成本高。数据加密过程:在对称加密算法中,数据发送方将明文(原始数据)和加密密钥经过特殊的加密处理,生成复杂的加密密文进行传输。数据解密过程:数据接收方收到密文后,如果想读取原始数据,需要使用加密时使用的密钥和相同算法的逆算法对加密后的密文进行解密,恢复为可读的明文。常用算法:DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、Skipjack等。下面主要介绍常用的DES、3DES、AES加密算法。DES加密算法DES加密算法是一种块密码,它使用64位作为一个块来加密数据,其密钥长度为56位,加密和解密采用相同的算法。DES加密算法对密钥保密,公开算法包括加密和解密算法。这样,只有与发送方拥有相同密钥的人才能解读出经过DES加密算法加密后的密文数据。因此,破译DES加密算法实际上就是在寻找密钥的编码方式。对于一个56位长度的密钥,如果采用穷举法进行搜索,运算次数为256次。随着计算机系统能力的不断发展,DES的安全性会比刚出现时弱很多,但是从非关键性的角度来看,还是算够用的。然而,DES现在仅用于遗留系统的身份验证,更多地用于新的加密标准。加密工具如下:/***encryption**@paramdatasource待加密数据*@paramkey*@returnbyte数组*/publicstaticbyte[]enCrypto(byte[]datasource,Stringkey)throwsInvalidKeyException,NoSuchAlgorithmException,InvalidKeySpecException,NoSuchPaddingException,BadPaddingException,IllegalBlockSizeException{SecureRandomrandom=newSecureRandom();DESKeySpecdesKey=newDESKeySpec(key.getBytes());//创建密钥工厂,然后用它把DESKeySpec转换成SecretKeyFactoryke??yFactory=SecretKeyFactory.getInstance("DES");SecretKeysecurekey=keyFactory。generateSecret(desKey);//Cipher对象真正完成加密操作Ciphercipher=Cipher.getInstance("DES");//用密钥初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE,securekey,random);//现在,获取数据并加密//正式执行加密操作returncipher.doFinal(datasource);}3DES加密算法DES是三重数据加密算法块密码的总称。相当于对每个数据块应用了三次DES加密算法。由于计算机计算能力的增强,原始DES密码的密钥长度变得容易被暴力破解;3DES旨在提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一个全新的分组密码算法。3DES是一种从DES过渡到AES的加密算法。加密算法的具体实现如下:设Ek()和Dk()分别代表DES算法的加解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文。加密过程为:C=Ek3(Dk2(Ek1(M)))加密工具类如下:/***方法说明:3DES加密**@paramplainTextplaintext*@paramsecretKeykey*@paramivencryptionvector*@returnStringciphertext*@throwsException*/publicstaticStringencode(StringplainText,StringsecretKey,Stringiv)throwsException{Keydeskey=null;DESedeKeySpecspec=newDESedeKeySpec(secretKey.getBytes());SecretKeyFactoryke??yfactory=SecretKeyFactory.getInstance("desede");deskey=keyfactory.generate);秘密(Ciphercipher=Cipher.getInstance("desede/CBC/PKCS5Padding");IvParameterSpecs=newIvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE,deskey,ips);byte[]encryptData=cipher.doFinal(纯文本。getBytes(encoding));returnBase64.encode(encryptData);}AES加密算法AES加密算法是密码学中的一种高级加密标准,数据包长度为128位,该算法应易于各种硬件和软件实现。这个加密算法就是blo美国联邦政府采用的ck加密标准。该标准用于替代原来的DES。它已被多方分析,并在世界范围内广泛使用。AES加密算法设计支持128/192/256位(/32=nb)的数据块大小(即数据包长度);支持128/192/256位(/32=nk)密码长度,十进制,对应34×1038、62×1057、1.1×1077键。加密工具类如下:/***AES加密*@paramdata待加密字符串*@paramkey加密密钥*@paramiv密码加密算法IV*@return加密字符串*/publicstaticStringencrypt(Stringdata,Stringkey,Stringiv){try{Ciphercipher=Cipher.getInstance("AES/CBC/NoPadding");intblockSize=cipher.getBlockSize();byte[]dataBytes=data.getBytes();intplaintextLength=dataBytes.length;if(plaintextLength%blockSize!=0){plaintextLength=plaintextLength+(blockSize-(plaintextLength%blockSize));}byte[]plaintext=newbyte[plaintextLength];System.arraycopy(dataBytes,0,plaintext,0,dataBytes.length);SecretKeySpeckeyspec=newSecretKeySpec(keyStringencrypt=Base64.getEncoder().encodeToString(encrypted);//BASE64加密encrypt=encrypt.replaceAll(newString(Constant.STRING_CARRIAGE_RETURN),Constant.STRING_BLANK);encrypt=encrypt.replaceAll(newString(Constant.STRING_LINE_FEED),Constant.STRING_BLANK);returnencrypt;}catch(Exceptione){e.printStackTrace();returnull;}}对称加密算法对比非对称加密算法非对称加密算法使用两个完全不同但完全匹配的一对密钥—公钥和私钥在使用非对称加密算法对文件进行加密时,只有一对匹配的公钥和私钥才能完成对明文的加解密过程。采用非对称加密算法,在双方通信之前,接收方必须将自己随机生成的公钥交给发送方,而私钥自己保管。由于非对称算法有两个密钥,特别适用于分布式系统中的数据加密。广泛使用的非对称加密算法有RSA算法和美国国家标准局提出的DSA。基于非对称加密算法的加密技术被广泛应用。工作流程:1.乙方生成一对密钥(公钥和私钥)并将公钥公开给其他方。2、甲方获得公钥后,用该密钥对保密信息进行加密,然后发送给乙方。3、乙方再用自己保管的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用自己的私钥(privatekey)来解密对应公钥加密的信息。在传输过程中,即使攻击者截取了传输的密文,得到了B的公钥,也无法破译密文,因为只有B的私钥才能解密密文。同理,如果B要回复加密信息给A,那么A需要将A的公钥公布给B加密,A保存A的私钥用于解密。RSA加密算法RSA加密算法是目前最有影响力的公钥加密算法,通常被认为是最好的公钥方案之一。RSA是第一个可以同时用于加密和数字签名的算法。它可以抵抗目前已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA加密算法基于一个非常简单的数论事实:两个大质数相乘非常容易,但乘积却极难分解,因此乘积可以作为加密密钥公开。加密工具类如下:/***RSA公钥加密**@paramstr加密字符串*@parampublicKey公钥*@returnciphertext*@throwsExceptionException加密时的信息*/publicstaticStringencrypt(Stringstr,StringpublicKey)throwsException{//base64编码公钥byte[]decoded=Base64.decodeBase64(publicKey);RSAPublicKeypubKey=(RSAPublicKey)KeyFactory.getInstance("RSA").generatePublic(newX509EncodedKeySpec(decoded));//RSA加密Ciphercipher=Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,pubKey);StringoutStr=Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));returnoutStr;}DSA加密算法DSA是基于整数有限的安全性离散对数问题的处理与RSA几乎相同。DSA的一个重要特点就是这两个质数是公开的,这样在使用别人的p和q时,即使不知道私钥,也可以确认它们是随机生成的还是被篡改过的。RSA算法做不到。DSA只是一种算法。与RSA不同的是它不能用于加密和解密,也不能用于密钥交换。它仅用于签名。它比RSA快得多。加密过程如下:ECC加密算法椭圆加密算法(ECC)是一种公钥加密体系,由Koblitz和Miller于1985年首先提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算难度。公钥密码体制按其所基于的问题一般分为三类:大整数分解问题、离散对数问题和椭圆曲线问题。有时椭圆曲线类也归为离散对数类。椭圆曲线密码体制是目前已知的公钥体制中每位加密强度最高的体制。解决椭圆曲线上离散对数问题的最佳算法是Pollardrho方法,其时间复杂度为,完全指数。加密工具如下:/***encryption*@paramdata*@parampublicKey*@return*@throwsException*/publicstaticbyte[]encrypt(byte[]data,StringpublicKey)throwsException{byte[]keyBytes=BASE64Decoder.decodeBuffer(publicKey);X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(keyBytes);KeyFactoryke??yFactory=KeyFactory.getInstance(ECCEnum.ALGORITHM.value());ECPublicKeypubKey=(ECPublicKey)keyFactory.generatePublic(x509KeySpec);Ciphercipher=newNull.CipherinDE(),Ciphercipher;returncipher.doFinal(数据));}非对称加密算法对比总结对称加密与非对称加密对比实际应用:用非对称加密算法管理对称算法的密钥,用对称加密算法加密数据,提高了加密速度。也实现了解密的安全性。RSA推荐使用1024位数字,ECC推荐使用160位数字,AES使用128位数字。其他方面的比较:在管理方面:公钥密码算法可以用更少的资源达到目的。在密钥分布上,两者之间存在指数差异(一个为n,另一个为n2)。因此,公钥密码算法不适合广域网使用,更重要的是,它不支持数字签名。在安全性方面:由于公钥密码算法是基于未解决的数学问题,因此几乎不可能被破解。对于私钥加密算法,虽然AES理论上是无法破解的,但是从计算机发展的角度来看。公钥更有优势。
