AS2协议详解(二)
上一篇中主要讲解了加密的理论知识,这篇来上代码。
签名和验签
通过信息摘要算法和非对称加密,可以实现信息的防伪造,防篡改,通过我们的私钥来签名消息,接收方就能通过我们的公钥来校验该消息是否是我们发送的。
获取证书库publicstaticKeyStoregetKeyStore(InputStreamkeyStoreInputStream,StringkeyStorePassword,StringkeyStoreType)throwsException{returngetKeyStore(keyStoreInputStream,keyStorePassword,keyStoreType);}publicstaticKeyStoregetKeyStore(InputStreamkeyStoreInputStream,StringkeyStorePassword,StringkeyStoreType,Stringprovider)throwsException{KeyStorekeyStore;if(StringUtils。isNotBlank(provider)){keyStoreKeyStore。getInstance(keyStoreType,provider);}else{keyStoreKeyStore。getInstance(keyStoreType);}keyStore。load(keyStoreInputStream,keyStorePassword。toCharArray());IoUtil。close(keyStoreInputStream);returnkeyStore;}从证书库中获取公钥publicstaticPublicKeygetPublicKeyFromKeyStore(KeyStorekeyStore,Stringalias)throwsException{CertificatecertificatekeyStore。getCertificate(alias);returncertificate。getPublicKey();}从证书库获取私钥publicstaticPrivateKeygetPrivateKeyFromKeyStore(KeyStorekeyStore,Stringalias,Stringpassword)throwsException{return(PrivateKey)keyStore。getKey(alias,password。toCharArray());}签名publicstaticbyte〔〕sign(byte〔〕message,PrivateKeyprivateKey,Stringalgorithm)throwsException{Signaturesignature;signatureSignature。getInstance(algorithm);signature。initSign(privateKey);signature。update(message);returnsignature。sign();}验签publicstaticbooleanverify(byte〔〕message,byte〔〕signMessage,PublicKeypublicKey,Stringalgorithm)throwsException{Signaturesignature;booleanverifyResult;signatureSignature。getInstance(algorithm);signature。initVerify(publicKey);signature。update(message);verifyResultsignature。verify(signMessage);returnverifyResult;}
然后写个单元测试来验证下
TestpublicvoidtestVerify()throwsException{FileInputStreamfisnewFileInputStream(newFile(d:keystestkeystore。keystore));获取证书库KeyStorekeyStoregetKeyStore(fis,mypassword,JKS);获取私钥PrivateKeyprivateKeygetPrivateKeyFromKeyStore(keyStore,mykeystore,mypassword);摘要算法用SHA1,非对称加密算法用RSA进行签名byte〔〕signMessagesign(CONTENT。getBytes(),privateKey,SHA1withRSA);获取公钥PublicKeypublicKeygetPublicKeyFromKeyStore(keyStore,mykeystore);进行验签booleanverifyverify(CONTENT。getBytes(),signMessage,publicKey,SHA1withRSA);System。out。println(verify);}
加密和解密
使用私钥加密publicstaticbyte〔〕encodeByPrivateKey(byte〔〕data,PrivateKeyprivateKey)throwsException{对数据加密,加密算法由创建秘钥时指定,也可以自己指定,一般用RSACiphercipherCipher。getInstance(privateKey。getAlgorithm());cipher。init(Cipher。ENCRYPTMODE,privateKey);returncipher。doFinal(data);}使用公钥解密publicstaticbyte〔〕decodeByPublicKey(byte〔〕data,PublicKeypublicKey)throwsException{对数据加密CiphercipherCipher。getInstance(publicKey。getAlgorithm());cipher。init(Cipher。DECRYPTMODE,publicKey);returncipher。doFinal(data);}公钥加密publicstaticbyte〔〕encodeByPublicKey(byte〔〕data,PublicKeypublicKey)throwsException{对数据加密CiphercipherCipher。getInstance(publicKey。getAlgorithm());cipher。init(Cipher。ENCRYPTMODE,publicKey);returncipher。doFinal(data);}私钥解密publicstaticbyte〔〕decodeByPrivateKey(byte〔〕data,PrivateKeyprivateKey)throwsException{对数据加密CiphercipherCipher。getInstance(privateKey。getAlgorithm());cipher。init(Cipher。DECRYPTMODE,privateKey);returncipher。doFinal(data);}
单元测试
publicstaticStringCONTENT寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗;TestpublicvoidtestDecode()throwsException{FileInputStreamfisnewFileInputStream(newFile(d:keystestkeystore。keystore));KeyStorekeyStoregetKeyStore(fis,mypassword,JKS);PrivateKeyprivateKeygetPrivateKeyFromKeyStore(keyStore,mykeystore,mypassword);PublicKeypublicKeygetPublicKeyFromKeyStore(keyStore,mykeystore);加密byte〔〕encodeencodeByPrivateKey(CONTENT。getBytes(),privateKey);解密byte〔〕messagedecodeByPublicKey(encode,publicKey);System。out。println(newString(message));}