2019独角兽企业重金招聘Python工程师标准>>>

?

license里就是一些注册信息,键值对组成的字符串

?

对称加密:

DES,AES,加密解密都用一个秘钥,速度快

非对称机密

RSA,可以私钥加密公钥解密,也可以公钥机密私钥解密,速度慢

注意:
RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。
RSA加密对明文的长度是有限制的,如果加密数据过大会抛出异常:

?

常见加密算法

DES?

??? DES是Data Encryption Standard(数据加密标准)的缩写,DES算法为密码体制中的对称密码体制。它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,二十年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
??? DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。
??? 特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
  DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间。

??? DES现在已经不视为一种安全的加密算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解。也有一些分析报告提出了该算法的理论上的弱点,虽然实际情况未必出现。该标准在最近已经被高级加密标准(AES)所取代。

?

AES

??? 高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

??? AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元。

?

RSA

??? RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

??? RSA算法的可靠性基于分解极大的整数是很困难的。假如有人找到一种很快的分解因子的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

??? RSA算法利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信息的保密和安全。

?

本文采用RSA加密算法加密license信息,可以运行RSATester.java生成公钥和私钥。
RSAUtils.java

<pre name="code" class="java">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> * <p> * 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman) * </p> * <p> * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/> * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/> * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全 * </p> * * @author IceWee * @date 2012-4-26 * @version 1.0 */ 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 = "RSAPublicKey";        /** *//**     * 获取私钥的key     */    private static final String PRIVATE_KEY = "RSAPrivateKey";        /** *//**     * 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());    } }

?

?Base64Utils.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;//import it.sauronsoftware.base64.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
//若报错,编译路径移除jdk,再添加jdk/** *//*** <p>* BASE64编码解码工具包* </p>* <p>* 依赖javabase64-1.3.1.jar 或 common-codec* </p>* * @author IceWee* @date 2012-5-19* @version 1.0*/
public class Base64Utils {/** *//*** 文件读取缓冲区大小*/private static final int CACHE_SIZE = 1024;/** *//*** <p>* BASE64字符串解码为二进制数据* </p>* * @param base64* @return* @throws Exception*/public static byte[] decode(String base64) throws Exception {//return Base64.decode(base64.getBytes());return new BASE64Decoder().decodeBuffer(base64);}/** *//*** <p>* 二进制数据编码为BASE64字符串* </p>* * @param bytes* @return* @throws Exception*/public static String encode(byte[] bytes) throws Exception {//return new String(Base64.encode(bytes));return new BASE64Encoder().encode(bytes);}/** *//*** <p>* 将文件编码为BASE64字符串* </p>* <p>* 大文件慎用,可能会导致内存溢出* </p>* * @param filePath 文件绝对路径* @return* @throws Exception*/public static String encodeFile(String filePath) throws Exception {byte[] bytes = fileToByte(filePath);return encode(bytes);}/** *//*** <p>* BASE64字符串转回文件* </p>* * @param filePath 文件绝对路径* @param base64 编码字符串* @throws Exception*/public static void decodeToFile(String filePath, String base64) throws Exception {byte[] bytes = decode(base64);byteArrayToFile(bytes, filePath);}/** *//*** <p>* 文件转换为二进制数组* </p>* * @param filePath 文件路径* @return* @throws Exception*/public static byte[] fileToByte(String filePath) throws Exception {byte[] data = new byte[0];File file = new File(filePath);if (file.exists()) {FileInputStream in = new FileInputStream(file);ByteArrayOutputStream out = new ByteArrayOutputStream(2048);byte[] cache = new byte[CACHE_SIZE];int nRead = 0;while ((nRead = in.read(cache)) != -1) {out.write(cache, 0, nRead);out.flush();}out.close();in.close();data = out.toByteArray();}return data;}/** *//*** <p>* 二进制数据写文件* </p>* * @param bytes 二进制数据* @param filePath 文件生成目录*/public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {InputStream in = new ByteArrayInputStream(bytes);   File destFile = new File(filePath);
//        if (!destFile.getParentFile().exists()) {
//            destFile.getParentFile().mkdirs();
//        }destFile.createNewFile();OutputStream out = new FileOutputStream(destFile);byte[] cache = new byte[CACHE_SIZE];int nRead = 0;while ((nRead = in.read(cache)) != -1) {   out.write(cache, 0, nRead);out.flush();}out.close();in.close();}}

?

RSATester.java

import java.util.Map;public class RSATester {static String publicKey;static String privateKey;static {try {Map<String, Object> keyMap = RSAUtils.genKeyPair();publicKey = RSAUtils.getPublicKey(keyMap);privateKey = RSAUtils.getPrivateKey(keyMap);System.err.println("公钥: \n\r" + publicKey);System.err.println("私钥: \n\r" + privateKey);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {test();testSign();}static void test() throws Exception {System.err.println("公钥加密——私钥解密");String source = "这是一行没有任何意义的文字,你看完了等于没看,不是吗?";System.out.println("\r加密前文字:\r\n" + source);byte[] data = source.getBytes();byte[] encodedData = RSAUtils.encryptByPublicKey(data, publicKey);System.out.println("加密后文字:\r\n" + new String(encodedData));byte[] decodedData = RSAUtils.decryptByPrivateKey(encodedData, privateKey);String target = new String(decodedData);System.out.println("解密后文字: \r\n" + target);}static void testSign() throws Exception {System.err.println("私钥加密——公钥解密");String source = "这是一行测试RSA数字签名的无意义文字";System.out.println("原文字:\r\n" + source);byte[] data = source.getBytes();byte[] encodedData = RSAUtils.encryptByPrivateKey(data, privateKey);System.out.println("加密后:\r\n" + new String(encodedData));byte[] decodedData = RSAUtils.decryptByPublicKey(encodedData, publicKey);String target = new String(decodedData);System.out.println("解密后: \r\n" + target);System.err.println("私钥签名——公钥验证签名");String sign = RSAUtils.sign(encodedData, privateKey);System.err.println("签名:\r" + sign);boolean status = RSAUtils.verify(encodedData, publicKey, sign);System.err.println("验证结果:\r" + status);}}

?

运行此类生成license?

LicenseGenerator.java

import java.io.File;/*** 生成license* @author zhao* 2014.6.15*/
public class LicenseGenerator {/*** serial:由客户提供* timeEnd:过期时间*/private static String licensestatic = "serial=568b8fa5cdfd8a2623bda1d8ab7b7b34;" +"timeEnd=1404057600000";private static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaa8y9g+ioR2OSs8njT5uCGWm0YmOA1elSu/P5\n"+ "D3XYPCHsUPab74V5Og+NEZeTk9/LtG+jPSpKekTWm67gS2lQYWoygTwnoWsr4woaqNXmWw7L8Ty0\n"+ "LQFTojZgyynvu2RSIJp4c76z6SV/khiP/ireGtt8uzXPswPO5uaPU38tQQIDAQAB";/*** RSA算法* 公钥和私钥是一对,此处只用私钥加密*/public static final String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJprzL2D6KhHY5KzyeNPm4IZabRi\n"+ "Y4DV6VK78/kPddg8IexQ9pvvhXk6D40Rl5OT38u0b6M9Kkp6RNabruBLaVBhajKBPCehayvjChqo\n"+ "1eZbDsvxPLQtAVOiNmDLKe+7ZFIgmnhzvrPpJX+SGI/+Kt4a23y7Nc+zA87m5o9Tfy1BAgMBAAEC\n"+ "gYAVnlfohEoTHQN0q1TtTNzRhutEhK23gLsMiSGr0Z1G64w4QFF2HT9LbHR25GqbD426QAWNDegY\n"+ "yytN/DesUQJqNXx8vuEuqs7+MQDgKgJqpAx+Fg3Iwsk/SVjq7meaSVGCgPKhtWHJk5oXoRMpsrlT\n"+ "AwUjpdpAZXIIKW3mrqkW0QJBANq4INw6lZlqRFtxT4uzYQYtzmB/nxMnCbL2SQ4ZQ/4CWlQpOnR/\n"+ "mH2JxIBCVtTADFlPM0DWF4aoqykYs9tu2X0CQQC0vgEk8DpkQbh1kgIyBGWCqYSKISTSXia0rbYo\n"+ "FPnzdldgtZVirNGNmiJGL8RPz0YKpZNOg9FLHq/oYXSNFI4VAkAJ4OcbC0pWc4ZC2wtMs/1d2hPI\n"+ "J/t3UfwOKTGDgYCgqFqMEpChUmIAyYgmgtiJI2NrZThbZVAKtPOGF6eH8anBAkAbxkL4wS3H8E1/\n"+ "S7OoqgJLZO9oJpW4+hzqkPM4D5klb58Xzm+pXTNKllAEBx0cwpZZ1n3fh+Qmrg2MIUW+1FTNAkBt\n"+ "WECowLUqW014M96WsFpiof7kjteOBNOjFyxhIbx2eT7//bnrADfq2Xu1/mSedUKrjGr/O+FRi7PO\n"+ "u7WhF6C9";public static void generator() throws Exception {System.err.println("私钥加密——公钥解密");//String source = "568b8fa5cdfd8a2623bda1d8ab7b7b34";System.out.println("原文字:\r\n" + licensestatic);byte[] data = licensestatic.getBytes();byte[] encodedData = RSAUtils.encryptByPrivateKey(data, privateKey);System.out.println("加密后:\r\n" + new String(encodedData)); //加密后乱码是正常的Base64Utils.byteArrayToFile(encodedData, FileUtil.getBasePath()+File.separator+"license.dat");System.out.println("license.dat:\r\n" + FileUtil.getBasePath()+File.separator+"license.dat");//解密byte[] decodedData = RSAUtils.decryptByPublicKey(encodedData, publicKey);String target = new String(decodedData);System.out.println("解密后: \r\n" + target);}public static void main(String[] args) throws Exception {generator();}
}
?

这里把解密逻辑也放这里了,实际上,公钥和机密逻辑应该放在软件运行的地方。

FileUtil.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.logging.Level;
import java.util.logging.Logger;/*** 文件工具类* @author zhao*/
public class FileUtil {/*** 获得类的基路径,打成jar包也可以正确获得路径* @return */public static String getBasePath(){/*/D:/zhao/Documents/NetBeansProjects/docCompare/build/classes//D:/zhao/Documents/NetBeansProjects/docCompare/dist/bundles/docCompare/app/docCompare.jar*/String filePath = FileUtil.class.getProtectionDomain().getCodeSource().getLocation().getFile();if (filePath.endsWith(".jar")){filePath = filePath.substring(0, filePath.lastIndexOf("/"));try {filePath = URLDecoder.decode(filePath, "UTF-8"); //解决路径中有空格%20的问题} catch (UnsupportedEncodingException ex) {}}File file = new File(filePath);filePath = file.getAbsolutePath();return filePath;}public static void main(String[] args) throws Exception {System.out.println(getBasePath());}
}

?

serial是软件运行的地方提供的,

纯java获取CPU序列号,生成机器码

http://happyqing.iteye.com/blog/2080402

?

参考

http://www.blogjava.net/icewee/archive/2012/05/19/378570.html

?

一个简单的RSA加密类

http://yuncode.net/code/c_5049f78253ad762

RSAEncrypt.java

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;/*** RSA加密类*/
public class RSAEncrypt {public static void main(String[] args) {try {RSAEncrypt encrypt = new RSAEncrypt();String encryptText = "12345678";KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();// Generate keysRSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 私钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 公钥byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());byte[] de = encrypt.decrypt(privateKey, e);System.out.println(encrypt.bytesToString(e));System.out.println();System.out.println(encrypt.bytesToString(de));} catch (Exception e) {e.printStackTrace();}}/*** byte数组转为string* @param encrytpByte* @return*/protected String bytesToString(byte[] encrytpByte) {String result = "";for (Byte bytes : encrytpByte) {result += (char) bytes.intValue();}return result;}/*** 加密方法* @param publicKey* @param obj* @return*/protected byte[] encrypt(RSAPublicKey publicKey, byte[] obj) {if (publicKey != null) {try {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(obj);} catch (Exception e) {e.printStackTrace();}}return null;}/*** 解密方法* @param privateKey* @param obj* @return*/protected byte[] decrypt(RSAPrivateKey privateKey, byte[] obj) {if (privateKey != null) {try {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(obj);} catch (Exception e) {e.printStackTrace();}}return null;}
}

?

说明:

公钥私钥要自己生成,别拷别人的

Over

?

?

转载于:https://my.oschina.net/ghm7753/blog/515726

java RSA加密生成license,用CPU序列号生成机器码相关推荐

  1. java RSA加密解密--转载

    原文地址:http://www.blogjava.net/icewee/archive/2012/05/19/378570.html 该工具类中用到了BASE64,需要借助第三方类库:javabase ...

  2. JAVA——RSA加密与解密

    基本概念 Base64:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. RSA: RSA加密算法是一种非对称加密算法 ...

  3. java RSA加密解密实现(含分段加密)

    该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detail/centralperk/50255 ...

  4. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

  5. Java RSA加密解密

    转自 http://blog.csdn.net/bbld_/article/details/38777491 概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数 ...

  6. java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过

    /** * RSA加密工具类 * 使用PKCS1_PADDING填充,密钥长度1024 * 加解密结果在这里测试通过:http://tool.chacuo.net/cryptrsaprikey * 注 ...

  7. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...

    前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...

  8. JAVA——RSA加密【X509EncodedKeySpec、PKCS8EncodedKeySpec、RSAPublicKeySpec、RSAPrivateKeySpec】

    基本概念 RSA加密算法:RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shami ...

  9. Java RSA加密(一)--BCD输出

    代码如下: import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; im ...

  10. android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

    最近作一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通讯须要实施安全方案.而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用 ...

最新文章

  1. linux怎么和宿主机同步时间,Linux 中设置和同步时间
  2. Angular和SAP C4C的事件处理队列
  3. Python SqlAlchemy使用方法
  4. simulink显示多个数据_Stateflow数据介绍(一)
  5. 微信小程序- 初试小程序之tabbar(选项卡,底部导航)的使用
  6. 驱动人生服务器版本_电脑驱动怎么装?电脑刚装系统怎么装驱动?
  7. struts2中jsp页面上验证码的生成
  8. 电脑锁屏按什么键解锁_手机屏幕密码忘了怎么解锁
  9. linux拨号上网icp,如何用 Linux 拨号上网
  10. caffe 源码阅读与运行流程
  11. mysql查询一张表中一共有多少条数据
  12. Js拼接Json供echarts的地图使用
  13. 9月14日-全外显子组测序分析流程
  14. DOS批处理下格式化日期字符串
  15. Vue项目url中的BASE_URL解析
  16. 初中 昆虫记思维导图_《昆虫记》的思维导图
  17. CSS,HTML,JS 以及Vue前端面试题八股文总结【看完你就变高手】
  18. 那些花儿(夏洛特烦恼版)
  19. 沟通的技巧--爱因斯坦如何向老太太解释相对论
  20. 夜深人静写算法(三)- 初等数论入门

热门文章

  1. Rust───crates 国内镜像源配置
  2. Rust : CTP 中异步处理
  3. (转)拿到软银44亿美金巨资后,WeWork要这样布局中国市场
  4. 从心理学角度看,如何通过故事影响客户的决策?
  5. 【优化算法】寄生-捕食算法(PPA)【含Matlab源码 1801期】
  6. 【SDPVRP】基于matlab遗传算法求解同时取送货的车辆路径问题【含Matlab源码 1487期】
  7. 【疾病分类】基于matlab GUI模糊逻辑分类叶病严重程度分级系统【含Matlab源码 194期】
  8. unity和python哪个好学_纠结学习Python还是unity3d_课课家教育
  9. java适配器模式_java设计模式之适配器模式
  10. linux内核提高系统实时性,Linux操作系统实时性分析及改进策略