[Android]加密技术

还是解都使用同一key需要keypublic keyprivate key)。使用public key必须使用private key行解

如,有A BA B A这时A使用了密钥生成生成keypublic keyprivate key), 首先A将public key通过网络发给了B,然后 B 用 public key对文件进行加密后,

将经过加密后的文件发给A,最后 A再用 private key对该文件进行解密。自始至终private key都没通过网络进行传输,因此,只要private key不泄露,即使public key和经过加密的文件都被截获,仍然无法对该文件进行解密,

因此,非对称加密较对称加密更安全。

Android SDK支持如3
1. MD5message-digest algorithm 5,信-), 广泛用于和解技术,用于校验管文件多大,MD5都能生成一的MD5。就在的ISO校验,都是MD5校验

2.  SHASecure Hash Algorithm),数应用中重要工具广泛地应用于电子商务等信息安全领域。虽然,SHA与 MD5通过碰撞法都被破解了,但是SHA仍然是公,较之MD5

3.  HMACHash Message Authentication Code,基于密钥Hash认证协议)。码实现别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。

使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

Android SDK支持4技术MD5SHAHMACAES。其中3种是AES是可实际上,如果Base64中的字符,也于一种Base64当于 key),

是可下面来看看使用上 4用数和解

MD5算法

// source数是待加密的字符encrypt_MD5方法返回加密后的
public String encrypt_MD5(String source) throws Exception
{
  MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(source.getBytes());
  return Base64.encodeToString(md5.digest(), Base64.DEFAULT);

}

 

SHA算法

public String encrypt_SHA(String source) throws Exception
{
  MessageDigest sha = MessageDigest.getInstance("SHA");
  sha.update(source.getBytes());
  return Base64.encodeToString(sha.digest(), Base64.DEFAULT);
}

 

HMAC算法

public static String initMacKey() throws Exception
{
  KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
  SecretKey secretKey = keyGenerator.generateKey();
  return Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT);
}
// HMAC
加密
public static String encrypt_HMAC(String source, String key)
throws Exception
{
  SecretKey secretKey = new SecretKeySpec(Base64.decode(key,
    Base64.DEFAULT), "HmacMD5");

  Mac mac = Mac.getInstance(secretKey.getAlgorithm());
  mac.init(secretKey);
  return Base64.encodeToString(mac.doFinal(source.getBytes()),
    Base64.DEFAULT);
}
// 使用HMAC数据进行加密
try
{
  String key = initMacKey();
  String result = encrypt_HMAC("Android", key);
}
catch (Exception e)
{
}

AES算法

// AES加密126加密也就16节)
public String encrypt_AES(String src, String key) throws Exception
{
  if (key == null)
  {
    Log.e("encrypt_aes_error", "Key
");
    return null;
  }
  //
判断Key16
  if (key.length() != 16)
  {
    Log.e("encrypt_aes_error", "Key
长度16");
    return null;
  }
  byte[] raw = key.getBytes();
  SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//
/模式/码方
  //
使用CBC模式需要一个iv可增加加密算法的
  IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());

  cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
  byte[] encrypted = cipher.doFinal(src.getBytes());

  return Base64.encodeToString(encrypted, Base64.DEFAULT);
}
// AES
解密
public String decrypt_AES(String src, String key) throws Exception
{
  try
  {
    //
判断Key否正确
    if (key == null)
    {
      Log.e("encrypt_aes_error", "Key
");      return null;
    }
  //
判断Key16
  if (key.length() != 16)
  {
    Log.e("encrypt_aes_error", "Key
长度16");
    return null;
  }
  byte[] raw = key.getBytes("ASCII");
  SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  IvParameterSpec iv = new IvParameterSpec(
    "0102030405060708".getBytes());
  cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
  byte[] encrypted1 = Base64.decode(src, Base64.DEFAULT);
  try
  {
    byte[] original = cipher.doFinal(encrypted1);
    String originalString = new String(original);
    return originalString;
  }
  catch (Exception e)
  {
    return null;
  }
}
catch (Exception ex)
{
  return null;

}

}

原文地址:https://www.cnblogs.com/spec-dog/p/3792683.html