Java公钥私钥签名工具包应用实例_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java公钥私钥签名工具包应用实例

Java公钥私钥签名工具包应用实例

 2014/10/18 12:39:46  zhuzhiguosnail  程序员俱乐部  我要评论(0)
  • 摘要:packagecom.locator.encryption;importjava.io.ByteArrayOutputStream;importjava.security.Key;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey
  • 标签:工具 Java 应用 实例
monospace !important; border: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; color: #006699 !important; float: none !important; height: auto !important; line-height: 1.1em !important; overflow: visible !important; vertical-align: baseline !important; width: auto !important; font-weight: bold !important; background: none !important;" class="java keyword">package?com.locator.encryption; ? import?java.io.ByteArrayOutputStream; import?java.security.Key; import?java.security.KeyFactory; import?java.security.KeyPair; import?java.security.KeyPairGenerator; import?java.security.PrivateKey; import?java.security.PublicKey; import?java.security.Signature; import?java.security.interfaces.RSAPrivateKey; import?java.security.interfaces.RSAPublicKey; import?java.security.spec.PKCS8EncodedKeySpec; import?java.security.spec.X509EncodedKeySpec; import?java.util.HashMap; import?java.util.Map; ? import?javax.crypto.Cipher; ? /** ?*?<p> ?*?RSA公钥/私钥/签名工具包 ?*?<p> ?*?字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/> ?*?由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/> ?*?非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全 ?*?</p> ?*? ?*/ public?class?RSAUtils{ ? ????/** ?????*?加密算法RSA ?????*/ ????public?static?final?String?KEY_ALGORITHM?=?"RSA"; ????? ????/** ?????*?签名算法 ?????*/ ????public?static?final?String?SIGNATURE_ALGORITHM?=?"MD5withRSA"; ? ????/** ?????*?获取公钥的key ?????*/ ????private?static?final?String?PUBLIC_KEY?=?"LocatorPublicKey"; ????? ????/** ?????*?获取私钥的key ?????*/ ????private?static?final?String?PRIVATE_KEY?=?"LocatorPrivateKey"; ????? ????/** ?????*?RSA最大加密明文大小 ?????*/ ????private?static?final?int?MAX_ENCRYPT_BLOCK?=?117; ????? ????/** ?????*?RSA最大解密密文大小 ?????*/ ????private?static?final?int?MAX_DECRYPT_BLOCK?=?128; ? ????/** ?????*?<p> ?????*?生成密钥对(公钥和私钥) ?????*?</p> ?????*? ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?Map<String,?Object>?genKeyPair()?throws?Exception?{ ????????KeyPairGenerator?keyPairGen?=?KeyPairGenerator.getInstance(KEY_ALGORITHM); ????????keyPairGen.initialize(1024); ????????KeyPair?keyPair?=?keyPairGen.generateKeyPair(); ????????RSAPublicKey?publicKey?=?(RSAPublicKey)?keyPair.getPublic(); ????????RSAPrivateKey?privateKey?=?(RSAPrivateKey)?keyPair.getPrivate(); ????????Map<String,?Object>?keyMap?=?new?HashMap<String,?Object>(2); ????????keyMap.put(PUBLIC_KEY,?publicKey); ????????keyMap.put(PRIVATE_KEY,?privateKey); ????????return?keyMap; ????} ????? ????/** ?????*?<p> ?????*?用私钥对信息生成数字签名 ?????*?</p> ?????*? ?????*?@param?data?已加密数据 ?????*?@param?privateKey?私钥(BASE64编码) ?????*? ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?String?sign(byte[]?data,?String?privateKey)?throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(privateKey); ????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????PrivateKey?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec); ????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM); ????????signature.initSign(privateK); ????????signature.update(data); ????????return?Base64Utils.encode(signature.sign()); ????} ? ????/** ?????*?<p> ?????*?校验数字签名 ?????*?</p> ?????*? ?????*?@param?data?已加密数据 ?????*?@param?publicKey?公钥(BASE64编码) ?????*?@param?sign?数字签名 ?????*? ?????*?@return ?????*?@throws?Exception ?????*? ?????*/ ????public?static?boolean?verify(byte[]?data,?String?publicKey,?String?sign) ????????????throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(publicKey); ????????X509EncodedKeySpec?keySpec?=?new?X509EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????PublicKey?publicK?=?keyFactory.generatePublic(keySpec); ????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM); ????????signature.initVerify(publicK); ????????signature.update(data); ????????return?signature.verify(Base64Utils.decode(sign)); ????} ? ????/** ?????*?<P> ?????*?私钥解密 ?????*?</p> ?????*? ?????*?@param?encryptedData?已加密数据 ?????*?@param?privateKey?私钥(BASE64编码) ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?byte[]?decryptByPrivateKey(byte[]?encryptedData,?String?privateKey) ????????????throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(privateKey); ????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????Key?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec); ????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm()); ????????cipher.init(Cipher.DECRYPT_MODE,?privateK); ????????int?inputLen?=?encryptedData.length; ????????ByteArrayOutputStream?out?=?new?ByteArrayOutputStream(); ????????int?offSet?=?0; ????????byte[]?cache; ????????int?i?=?0; ????????//?对数据分段解密 ????????while?(inputLen?-?offSet?>?0)?{ ????????????if?(inputLen?-?offSet?>?MAX_DECRYPT_BLOCK)?{ ????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?MAX_DECRYPT_BLOCK); ????????????}?else?{ ????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?inputLen?-?offSet); ????????????} ????????????out.write(cache,?0,?cache.length); ????????????i++; ????????????offSet?=?i?*?MAX_DECRYPT_BLOCK; ????????} ????????byte[]?decryptedData?=?out.toByteArray(); ????????out.close(); ????????return?decryptedData; ????} ? ????/** ?????*?<p> ?????*?公钥解密 ?????*?</p> ?????*? ?????*?@param?encryptedData?已加密数据 ?????*?@param?publicKey?公钥(BASE64编码) ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?byte[]?decryptByPublicKey(byte[]?encryptedData,?String?publicKey) ????????????throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(publicKey); ????????X509EncodedKeySpec?x509KeySpec?=?new?X509EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????Key?publicK?=?keyFactory.generatePublic(x509KeySpec); ????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm()); ????????cipher.init(Cipher.DECRYPT_MODE,?publicK); ????????int?inputLen?=?encryptedData.length; ????????ByteArrayOutputStream?out?=?new?ByteArrayOutputStream(); ????????int?offSet?=?0; ????????byte[]?cache; ????????int?i?=?0; ????????//?对数据分段解密 ????????while?(inputLen?-?offSet?>?0)?{ ????????????if?(inputLen?-?offSet?>?MAX_DECRYPT_BLOCK)?{ ????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?MAX_DECRYPT_BLOCK); ????????????}?else?{ ????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?inputLen?-?offSet); ????????????} ????????????out.write(cache,?0,?cache.length); ????????????i++; ????????????offSet?=?i?*?MAX_DECRYPT_BLOCK; ????????} ????????byte[]?decryptedData?=?out.toByteArray(); ????????out.close(); ????????return?decryptedData; ????} ? ????/** ?????*?<p> ?????*?公钥加密 ?????*?</p> ?????*? ?????*?@param?data?源数据 ?????*?@param?publicKey?公钥(BASE64编码) ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?byte[]?encryptByPublicKey(byte[]?data,?String?publicKey) ????????????throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(publicKey); ????????X509EncodedKeySpec?x509KeySpec?=?new?X509EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????Key?publicK?=?keyFactory.generatePublic(x509KeySpec); ????????//?对数据加密 ????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm()); ????????cipher.init(Cipher.ENCRYPT_MODE,?publicK); ????????int?inputLen?=?data.length; ????????ByteArrayOutputStream?out?=?new?ByteArrayOutputStream(); ????????int?offSet?=?0; ????????byte[]?cache; ????????int?i?=?0; ????????//?对数据分段加密 ????????while?(inputLen?-?offSet?>?0)?{ ????????????if?(inputLen?-?offSet?>?MAX_ENCRYPT_BLOCK)?{ ????????????????cache?=?cipher.doFinal(data,?offSet,?MAX_ENCRYPT_BLOCK); ????????????}?else?{ ????????????????cache?=?cipher.doFinal(data,?offSet,?inputLen?-?offSet); ????????????} ????????????out.write(cache,?0,?cache.length); ????????????i++; ????????????offSet?=?i?*?MAX_ENCRYPT_BLOCK; ????????} ????????byte[]?encryptedData?=?out.toByteArray(); ????????out.close(); ????????return?encryptedData; ????} ? ????/** ?????*?<p> ?????*?私钥加密 ?????*?</p> ?????*? ?????*?@param?data?源数据 ?????*?@param?privateKey?私钥(BASE64编码) ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?byte[]?encryptByPrivateKey(byte[]?data,?String?privateKey) ????????????throws?Exception?{ ????????byte[]?keyBytes?=?Base64Utils.decode(privateKey); ????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes); ????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM); ????????Key?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec); ????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm()); ????????cipher.init(Cipher.ENCRYPT_MODE,?privateK); ????????int?inputLen?=?data.length; ????????ByteArrayOutputStream?out?=?new?ByteArrayOutputStream(); ????????int?offSet?=?0; ????????byte[]?cache; ????????int?i?=?0; ????????//?对数据分段加密 ????????while?(inputLen?-?offSet?>?0)?{ ????????????if?(inputLen?-?offSet?>?MAX_ENCRYPT_BLOCK)?{ ????????????????cache?=?cipher.doFinal(data,?offSet,?MAX_ENCRYPT_BLOCK); ????????????}?else?{ ????????????????cache?=?cipher.doFinal(data,?offSet,?inputLen?-?offSet); ????????????} ????????????out.write(cache,?0,?cache.length); ????????????i++; ????????????offSet?=?i?*?MAX_ENCRYPT_BLOCK; ????????} ????????byte[]?encryptedData?=?out.toByteArray(); ????????out.close(); ????????return?encryptedData; ????} ? ????/** ?????*?<p> ?????*?获取私钥 ?????*?</p> ?????*? ?????*?@param?keyMap?密钥对 ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?String?getPrivateKey(Map<String,?Object>?keyMap) ????????????throws?Exception?{ ????????Key?key?=?(Key)?keyMap.get(PRIVATE_KEY); ????????return?Base64Utils.encode(key.getEncoded()); ????} ? ????/** ?????*?<p> ?????*?获取公钥 ?????*?</p> ?????*? ?????*?@param?keyMap?密钥对 ?????*?@return ?????*?@throws?Exception ?????*/ ????public?static?String?getPublicKey(Map<String,?Object>?keyMap) ????????????throws?Exception?{ ????????Key?key?=?(Key)?keyMap.get(PUBLIC_KEY); ????????return?Base64Utils.encode(key.getEncoded()); ????} ? }
发表评论
用户名: 匿名