`
hecal
  • 浏览: 78487 次
社区版块
存档分类
最新评论

<转载>实现android的AES加密技术

阅读更多
原文地址:实现android的AES加密技术作者:大牛

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之命名之,投稿高级加密标准的甄选流程(Rijdael的发音近于 “Rhine doll”)。

AES 加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个 Byte)。(Rijndael加密法因支援更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1. AddRoundKey — 矩阵中的每一个字节都与该次循环的子密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
2. SubBytes — 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
3. ShiftRows — 将矩阵中的每个横列进行循环式移位。
4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。

最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

[转载]实现android的AES加密技术

java类文件:

  1. import java.security.SecureRandom;   
  2.   
  3. import javax.crypto.Cipher;   
  4. import javax.crypto.KeyGenerator;   
  5. import javax.crypto.SecretKey;   
  6. import javax.crypto.spec.SecretKeySpec;   
  7.   
  8.   
  9. public class SimpleCrypto {   
  10.   
  11.     public static String encrypt(String seed, String cleartext) throws Exception {   
  12.         byte[] rawKey = getRawKey(seed.getBytes());   
  13.         byte[] result = encrypt(rawKey, cleartext.getBytes());   
  14.         return toHex(result);   
  15.     }   
  16.        
  17.     public static String decrypt(String seed, String encrypted) throws Exception {   
  18.         byte[] rawKey = getRawKey(seed.getBytes());   
  19.         byte[] enc = toByte(encrypted);   
  20.         byte[] result = decrypt(rawKey, enc);   
  21.         return new String(result);   
  22.     }   
  23.   
  24.     private static byte[] getRawKey(byte[] seed) throws Exception {   
  25.         KeyGenerator kgen = KeyGenerator.getInstance("AES");   
  26.         SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");   
  27.         sr.setSeed(seed);   
  28.         kgen.init(128, sr); // 192 and 256 bits may not be available   
  29.         SecretKey skey = kgen.generateKey();   
  30.         byte[] raw = skey.getEncoded();   
  31.         return raw;   
  32.     }   
  33.   
  34.        
  35.     private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {   
  36.         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
  37.         Cipher cipher = Cipher.getInstance("AES");   
  38.         cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
  39.         byte[] encrypted = cipher.doFinal(clear);   
  40.         return encrypted;   
  41.     }   
  42.   
  43.     private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {   
  44.         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
  45.         Cipher cipher = Cipher.getInstance("AES");   
  46.         cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
  47.         byte[] decrypted = cipher.doFinal(encrypted);   
  48.         return decrypted;   
  49.     }   
  50.   
  51.     public static String toHex(String txt) {   
  52.         return toHex(txt.getBytes());   
  53.     }   
  54.     public static String fromHex(String hex) {   
  55.         return new String(toByte(hex));   
  56.     }   
  57.        
  58.     public static byte[] toByte(String hexString) {   
  59.         int len = hexString.length()/2;   
  60.         byte[] result = new byte[len];   
  61.         for (int i = 0; i < len; i++)   
  62.             result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).bytue();   
  63.         return result;   
  64.     }   
  65.   
  66.     public static String toHex(byte[] buf) {   
  67.         if (buf == null)   
  68.             return "";   
  69.         StringBuffer result = new StringBuffer(2*buf.length);   
  70.         for (int i = 0; i < buf.length; i++) {   
  71.             appendHex(result, buf[i]);   
  72.         }   
  73.         return result.toString();   
  74.     }   
  75.     private final static String HEX = "0123456789ABCDEF";   
  76.     private static void appendHex(StringBuffer sb, byte b) {   
  77.         sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));   
  78.     }   
  79.        

 加密:String encryptingCode = SimpleCrypto.encrypt(masterPassword,originalText);

解密:String originalText = SimpleCrypto.decrypt(masterpassword, encryptingCode);

分享到:
评论

相关推荐

    Android中JNI实现AES加密源代码

    Android提供了一个名为`&lt;android/openssl/AES.h&gt;`的库,里面包含了AES加密的函数,如`EVP_EncryptInit_ex()`, `EVP_EncryptUpdate()`, `EVP_EncryptFinal_ex()`等,用于初始化加密上下文、进行加密操作以及结束加密...

    android使用AES加密和解密文件实例代码

    Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密...本文提供了详细的实例代码和解释,可以帮助开发者实现 Android 应用程序中的 AES 加密和解密功能。

    Android下AES加密算法的JNI实现(包含SO文件)

    总的来说,这个资源提供了一个完整的Android JNI AES加密实现,包括了必要的SO库文件和Java调用示例,对于想要在Android应用中实现高效加密功能的开发者来说,是一个非常实用的参考。在实际开发中,可以根据具体需求...

    android AES加密工具类

    android 可以使用的 AES加密工具类

    AES加密解密算法 iOS和Android完美实现

    在iOS和Android平台上实现AES加密解密是开发者经常遇到的任务,尤其对于需要跨平台传输和存储敏感信息的场景。本篇文章将详细探讨AES加密解密算法在iOS和Android平台上的实现原理以及具体步骤。 首先,AES算法基于...

    Android AES加密解密

    在本文中,我们将深入探讨Android环境下如何实现AES加密解密,以及如何修改加密过程中的关键参数——密钥(key)和偏移量(initialization vector,简称IV)。 首先,了解AES加密的基本原理:AES是一种块密码,将...

    Android之AES加密

    本篇文章将深入探讨Android环境下如何实现AES加密,并提供一个名为`AndroidAesDemo`的示例项目来帮助理解。 AES加密的核心原理是通过一系列的替换、置换和混淆操作,将明文数据转换为不可读的密文。这个过程是可逆...

    android AES 加密算法

    android和JAVA的AES加密算法,从自己的项目中取出来的,分享给有需要的机油

    AES加密算法(C++实现,附源码)

    AES加密算法,全称为Advanced Encryption Standard,是一种广泛应用的对称加密技术,用于保护数据的机密性。在C++环境中实现AES加密算法,通常涉及到的关键概念包括密钥、明文、密文、加密过程和解密过程。源码中...

    Qt实现AES加密解密

    在IT领域,加密技术是确保数据安全的重要手段之一。AES(Advanced Encryption Standard)是一种广泛应用的对称加密算法,因其高效性和安全性而被广泛采纳。本文将深入探讨如何使用Qt库来实现AES加密与解密,并重点...

    AES加密解密 JS html 前端

    &lt;title&gt;AES CBC 加密解密&lt;/title&gt; &lt;script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;script&gt; // 密钥和初始向量IV const key = CryptoJS.lib....

    Android RSA AES 加密库

    总结来说,Android RSA AES加密库是将RSA非对称加密和AES对称加密相结合,利用JNI技术在C/C++层实现高效加密解密的工具,为Android应用提供了强大的数据安全保障。开发者可以通过这样的库,为自己的应用添加高级别的...

    C语言实现的AES加密解密

    标题 "C语言实现的AES加密解密" 涉及到的是高级加密标准(Advanced Encryption Standard,简称AES),这是一种广泛使用的对称加密算法,用于保护数据的安全性。AES由NIST(美国国家标准与技术研究所)在2001年标准化...

    AES(rijndael)算法实现

    &lt;br&gt;此为官网的实现算法,经过测试,完全可以使用。附件中包括c和c++代码实现。&lt;br&gt;官网地址为:http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html&lt;br&gt;

    iOS与Android通用AES加密

    "iOS与Android通用AES加密"是一个针对这两个主流操作系统实现的数据加密方案,确保信息在传输和存储过程中的安全性。 AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,因其...

    android ios 通用 AES加密

    本篇文章将深入探讨AES加密在Java、Android、iOS以及C#中的应用,以及如何实现这些平台之间的通用加密方式。 AES,即高级加密标准,是一种块密码,采用128位的块大小进行操作,并支持128、192和256位的密钥长度。其...

    android实现视频的加密和解密(使用AES)

    "Android 实现视频的加密和解密(使用 AES)" Android 平台上的视频加密和解密是非常重要的安全机制,以防止视频内容被非法访问和盗用。在本文中,我们将介绍如何使用 AES 算法在 Android 平台上实现视频的加密和...

    android Aes 加密解密

    在某些加密实现中,密钥可能会通过位移操作(如循环左移)来增加复杂性,使得攻击者更难破解。然而,具体在Android AES加密中,位移量的具体含义需要查看代码实现才能明确。 **Base64编码** Base64是一种用于将二...

    QT 实现AES 加密算法

    在QT中实现AES(Advanced Encryption Standard)加密算法,可以帮助开发者确保数据的安全性,防止未授权的访问和篡改。AES是目前国际上广泛采用的一种块密码标准,因其高效性和安全性而备受推崇。 AES加密算法基于...

Global site tag (gtag.js) - Google Analytics