三个常用加密解密
1.md5摘要
会将任何长度的转成16个byte数组
public static String encode(String content){
MessageDigest digest= null;
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
digest.update(content.getBytes());
byte []bytes=digest.digest();
Log.e( "encode: ",bytes.length+"" );
return getString(bytes);
}
private static String getString(byte[] b){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < b.length; i ++){
sb.append(b[i]);
}
return sb.toString();
}
2.base64将任何byte数组转成string类型进行传输
在交互的时候用于传输图片或者文件,js中应用比较频繁
//加密
public static String encoding(Context context){
String content= null;
try {
InputStream inputStream=context.getAssets().open("app检查.zip");
byte[]bytes=new byte[inputStream.available()];
inputStream.read(bytes);
content = Base64.encodeToString(bytes,Base64.DEFAULT);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return content;
}
//解密
public static void decoding(String content){
File file=new File("/sdcard/5.zip");
FileOutputStream outputStream=null;
try {
if (!file.exists()){
file.createNewFile();
}
byte[]bytes= Base64.decode(content.getBytes(),Base64.DEFAULT);
outputStream=new FileOutputStream(file);
outputStream.write(bytes);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.RSA加密解密
在客户端对数据使用公钥加密
在服务器端使用私钥进行解密
这个是百度百科上提供的各种方法可以直接使用。我使用的公钥和私钥是方法生成的代码中也有
呈现的状态也是以base64结果进行传输的:
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
private static final String PRIVATE_KEY_VALUE = "MIICXAIBAAKBgQDJRCHXC/Gzu0Tyvuz42mS73dZ8SkQ/eEon2MIc4nB4JZgdMOAV\n" +
"gZ8SVlRQJ5+XRAL48SHKBobIMHv/WsQWw8ik0BkIY1Ze70j4ouwQXSoFUCZYqm3s\n" +
"PQiCQPYhxw2WiVvnvK8B8zbLHyaPJhxuUWebLiZnhFGX9SVrfMSOLxjiUQIDAQAB\n" +
"AoGBAKwah7llLEzdwUq2OttdnTAMtYFY3F1N1lOWhf6/Hx+OPjIP/j5FtimvCq/0\n" +
"AgMOlGAdiiBATnbXBuFH01AIIQRR2zoP2H1tsiWKCYN6lLjvehfgxu/seuPHtL9x\n" +
"EfKDisDH41liezP9GEab0K0epJJJ+0t6T6TurwkH8UVp+HPxAkEA6RBApS+xjPvP\n" +
"BNSxGU8wgdoVN/GZfEe5izATUQPaCQeW1amscy3K2SmYZQg7HYTPzxux1ABGevna\n" +
"Q3wSnECuvQJBAN0SyOOX2IKrEU4sJA7Ep8qBmnXuSgfS/JUeW1xtdaJlm/wvJiOW\n" +
"kYOmyKTAO/6qIdjdiwB1papfbOvaTIREtSUCQAZZ9QkLZbFL43ZkPXdNGytOwClI\n" +
"IkCqy7mpU71vd2+rj0a/Wv3Aj7ifU5HdSY8iYW9pd80pPMJ5MKOKLA+qC5kCQBYN\n" +
"Dp6tAbqe5539hyc19GqdnNOQji/TmsAhBAnnHSmyqulvpoU8Oo2AMFlGl3VicPfZ\n" +
"uUi1c23YENxBrQowdEUCQE6B8f55+QiBDkyuI4g5X7ciiBabgvgQ76eLTXZRqe49\n" +
"C70KYFcDEUq9CQlmqw5p5+iqbnc9iff4oEMqdsMbhnM=";
private static final String PUBLIC_KEY_VALUE="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJRCHXC/Gzu0Tyvuz42mS73dZ8\n" +
"SkQ/eEon2MIc4nB4JZgdMOAVgZ8SVlRQJ5+XRAL48SHKBobIMHv/WsQWw8ik0BkI\n" +
"Y1Ze70j4ouwQXSoFUCZYqm3sPQiCQPYhxw2WiVvnvK8B8zbLHyaPJhxuUWebLiZn\n" +
"hFGX9SVrfMSOLxjiUQIDAQAB";
public static byte[] decryptBASE64(String key) {
return Base64.decode(key,Base64.DEFAULT);
}
public static String encryptBASE64(byte[] bytes) {
return Base64.encodeToString(bytes,Base64.DEFAULT);
}
/**
* 用私钥对信息生成数字签名
*
* @param data 加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
// 解密由base64编码的私钥
byte[] keyBytes = decryptBASE64(privateKey);
// 构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取私钥匙对象
PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 用私钥对信息生成数字签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);
return encryptBASE64(signature.sign());
}
/**
* 校验数字签名
*
* @param data 加密数据
* @param publicKey 公钥
* @param sign 数字签名
* @return 校验成功返回true 失败返回false
* @throws Exception
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
// 解密由base64编码的公钥
byte[] keyBytes = decryptBASE64(publicKey);
// 构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取公钥匙对象
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);
// 验证签名是否正常
return signature.verify(decryptBASE64(sign));
}
public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 解密<br>
* 用私钥解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(String data, String key)
throws Exception {
return decryptByPrivateKey(decryptBASE64(data),key);
}
/**
* 解密<br>
* 用公钥解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 加密<br>
* 用公钥加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(String data, String key)
throws Exception {
// 对公钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data.getBytes());
}
/**
* 加密<br>
* 用私钥加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 取得私钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Key> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 取得公钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Key> keyMap)
throws Exception {
Key key = keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 初始化密钥
*
* @return
* @throws Exception
*/
public static Map<String, Key> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
Map<String, Key> keyMap = new HashMap(2);
keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥
keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥
return keyMap;
}
上面是工具类
在方法中如此调用:
public class RSAActivity extends AppCompatActivity {
private TextView textView1;
private EditText editText1;
private Button button1;
private Button button2;
private TextView textView2;
private Map<String, Key> map;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rsa);
try {
//c初始化key
map = RSACoder.initKey();
} catch (Exception e) {
e.printStackTrace();
}
textView1 = ((TextView) findViewById(R.id.tv2));
textView2 = ((TextView) findViewById(R.id.tv3));
button1 = ((Button) findViewById(R.id.bt));
button2 = ((Button) findViewById(R.id.bt2));
editText1 = ((EditText) findViewById(R.id.et));
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content=editText1.getText().toString();
byte []bytes=null;
try {
bytes = RSACoder.encryptByPublicKey(content,RSACoder.getPublicKey(map));
} catch (Exception e) {
e.printStackTrace();
}
textView1.setText(RSACoder.encryptBASE64(bytes));
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content=textView1.getText().toString();
byte []bytes=null;
byte []byte2=null;
try {
bytes= RSACoder.decryptBASE64(content);
byte2 = RSACoder.decryptByPrivateKey(bytes,RSACoder.getPrivateKey(map));
} catch (Exception e) {
e.printStackTrace();
}
textView2.setText(new String(byte2));
}
});
}
}
然后提供一个工具用于生成随机的公钥私钥
http://pan.baidu.com/s/1kVPwrGF
虽然是32位的在64位电脑上也能正常使用
下面是生成的命令:
opensll工具
公钥加密:
genrsa -out rsa_private_key.pem 1024
私钥解密:
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem