700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 加密算法(二)——MD5 Base64 DES RSA加密算法解析

加密算法(二)——MD5 Base64 DES RSA加密算法解析

时间:2021-04-18 01:00:02

相关推荐

加密算法(二)——MD5 Base64 DES RSA加密算法解析

在java中,诸如MD5、BASE64、DES、RSA等经典加密解密算法,JDK都有提供专门的API来封装相关操作。下面逐一介绍每种算法的具体应用流程。

一、 MD5加密算法:

MD5算法,是一种基于哈希函数的单向加密算法,只能加密、无法解密。Java中提供了MD5算法的API

1.创建md5对象:

2. 进行加密操作:

3. 将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。

4.如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。

[java]view plaincopy publicvoidtestMD5()throwsException{StringplainText="Hello,world!";//创建MD5对象MessageDigestmd5=MessageDigest.getInstance("md5");//加密操作byte[]cipherData=md5.digest(plainText.getBytes());//组织输出StringBuilderbuilder=newStringBuilder();for(bytecipher:cipherData){//将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数StringtoHexStr=Integer.toHexString(cipher&0xff);//如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串builder.append(toHexStr.length()==1?"0"+toHexStr:toHexStr);}System.out.println(builder.toString());//c0bb4f54f1d8b14caf6fe1069e5f93ad} 二、使用BASE64进行加密/解密:

使用BASE64算法通常用作对二进制数据进行加密,加密之后的数据不易被肉眼识别。BASE64的加密解密算法都是公开的,可进行加密解密操作。

具体步骤同MD5,首先实例化base64对象,进行加密操作

[java]view plaincopy /***功能简述:使用BASE64进行双向加密/解密.*@throwsException*/publicvoidtestBase64()throwsException{BASE64Encoderencoder=newBASE64Encoder();BASE64Decoderdecoder=newBASE64Decoder();StringplainText="Hello,world!";StringcipherText=encoder.encode(plainText.getBytes());System.out.println("cipherText:"+cipherText);//cipherText:SGVsbG8gLCB3b3JsZCAhSystem.out.println("plainText:"+newString(decoder.decodeBuffer(cipherText)));//plainText:Hello,world!} 三、使用DES对称加密/解密:

数据加密标准算法(Data Encryption Standard),和BASE64最明显的区别就是有一个公有密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串。使用DES加密、解密的核心是确保工作密钥的安全性。

1.根据key生成密钥:

2.加密操作:

3.为了便于观察生成的加密数据,使用BASE64再次加密:

4.解密操作:

[java]view plaincopy /***功能简述:使用DES对称加密/解密.*@throwsException*/publicvoidtestDES()throwsException{StringplainText="Hello,world!";Stringkey="12345678";//要求key至少长度为8个字符//根据key生成密钥SecureRandomrandom=newSecureRandom();DESKeySpeckeySpec=newDESKeySpec(key.getBytes());SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("des");SecretKeysecretKey=keyFactory.generateSecret(keySpec);//加密操作Ciphercipher=Cipher.getInstance("des");cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);byte[]cipherData=cipher.doFinal(plainText.getBytes());//为了便于观察生成的加密数据,使用BASE64再次加密System.out.println("cipherText:"+newBASE64Encoder().encode(cipherData));//PtRYi3sp7TOR69UrKEIicA==//解密操作cipher.init(Cipher.DECRYPT_MODE,secretKey,random);byte[]plainData=cipher.doFinal(cipherData);System.out.println("plainText:"+newString(plainData));//Hello,world!} 四、使用RSA非对称加密/解密:

RSA算法是非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。用户通过https协议访问服务器时,就是使用非对称加密算法进行数据的加密、解密操作的。

服务器发送数据给客户端时使用私钥(private key)进行加密,并且使用加密之后的数据和私钥生成数字签名(digital signature)并发送给客户端。客户端接收到服务器发送的数据会使用公钥(public key)对数据来进行解密,并且根据加密数据和公钥验证数字签名的有效性,防止加密数据在传输过程中被第三方进行了修改。

客户端发送数据给服务器时使用公钥进行加密,服务器接收到加密数据之后使用私钥进行解密。

1.创建密钥对KeyPair:

2.获取公钥/私钥:

3.服务器数据使用私钥加密:

4.用户使用公钥解密:

5.服务器根据私钥和加密数据生成数字签名:

6.用户根据公钥、加密数据验证数据是否被修改过:

[java]view plaincopy /***功能简述:使用RSA非对称加密/解密.*@throwsException*/publicvoidtestRSA()throwsException{StringplainText="Hello,world!";//生成公钥私钥KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance("rsa");keyPairGenerator.initialize(1024);KeyPairkeyPair=keyPairGenerator.generateKeyPair();PublicKeypublicKey=keyPair.getPublic();PrivateKeyprivateKey=keyPair.getPrivate();Ciphercipher=Cipher.getInstance("rsa");SecureRandomrandom=newSecureRandom();//私钥加密cipher.init(Cipher.ENCRYPT_MODE,privateKey,random);byte[]cipherData=cipher.doFinal(plainText.getBytes());//转成base64System.out.println("cipherText:"+newBASE64Encoder().encode(cipherData));//yQ+vHwHqXhuzZ/N8iNg=//公钥认证cipher.init(Cipher.DECRYPT_MODE,publicKey,random);byte[]plainData=cipher.doFinal(cipherData);System.out.println("plainText:"+newString(plainData));//Hello,world!/**保证消息的完整性*///服务器根据私钥和加密数据生成数字签名,使用私钥+私钥加密后的数据==》sign生成签名Signaturesignature=Signature.getInstance("MD5withRSA");signature.initSign(privateKey);signature.update(cipherData);byte[]signData=signature.sign();System.out.println("signature:"+newBASE64Encoder().encode(signData));///t9ewo+KYCWKOgvu5QQ=//用户根据公钥、加密数据验证数据是否被修改过,使用公钥+私钥加密后的数据===》verify(signData)signature.initVerify(publicKey);signature.update(cipherData);booleanstatus=signature.verify(signData);System.out.println("status:"+status);//true}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。