`

实现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取代。


import java.security.SecureRandom;   
  
import javax.crypto.Cipher;   
import javax.crypto.KeyGenerator;   
import javax.crypto.SecretKey;   
import javax.crypto.spec.SecretKeySpec;   
  
  
public class SimpleCrypto {   
  
    public static String encrypt(String seed, String cleartext) throws Exception {   
        byte[] rawKey = getRawKey(seed.getBytes());   
        byte[] result = encrypt(rawKey, cleartext.getBytes());   
        return toHex(result);   
    }   
       
    public static String decrypt(String seed, String encrypted) throws Exception {   
        byte[] rawKey = getRawKey(seed.getBytes());   
        byte[] enc = toByte(encrypted);   
        byte[] result = decrypt(rawKey, enc);   
        return new String(result);   
    }   
  
    private static byte[] getRawKey(byte[] seed) throws Exception {   
        KeyGenerator kgen = KeyGenerator.getInstance("AES");   
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");   
        sr.setSeed(seed);   
        kgen.init(128, sr); // 192 and 256 bits may not be available   
        SecretKey skey = kgen.generateKey();   
        byte[] raw = skey.getEncoded();   
        return raw;   
    }   
  
       
    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {   
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES");   
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
        byte[] encrypted = cipher.doFinal(clear);   
        return encrypted;   
    }   
  
    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {   
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES");   
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
        byte[] decrypted = cipher.doFinal(encrypted);   
        return decrypted;   
    }   
  
    public static String toHex(String txt) {   
        return toHex(txt.getBytes());   
    }   
    public static String fromHex(String hex) {   
        return new String(toByte(hex));   
    }   
       
    public static byte[] toByte(String hexString) {   
        int len = hexString.length()/2;   
        byte[] result = new byte[len];   
        for (int i = 0; i < len; i++)   
            result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).bytue();   
        return result;   
    }   
  
    public static String toHex(byte[] buf) {   
        if (buf == null)   
            return "";   
        StringBuffer result = new StringBuffer(2*buf.length);   
        for (int i = 0; i < buf.length; i++) {   
            appendHex(result, buf[i]);   
        }   
        return result.toString();   
    }   
    private final static String HEX = "0123456789ABCDEF";   
    private static void appendHex(StringBuffer sb, byte b) {   
        sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));   
    }   
       
} 

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

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

  • 大小: 49.1 KB
分享到:
评论
3 楼 lishiyaowanmei 2011-11-07  
并且对同一个字符 同样的公钥 在两个虚拟机中加密的结果都不一样 解密就不用说了
2 楼 lishiyaowanmei 2011-11-07  
算法是没有问题的 在dvm中加密和解密密钥问题 在jvm中加密和解密也没有问题  但是在dvm加密,jvm解密 不行的 ,同样反之也不行
1 楼 lishiyaowanmei 2011-11-07  
您在android客户端和服务器端 传递数据用过吗

相关推荐

    Android中JNI实现AES加密源代码

    综上所述,"Android中JNI实现AES加密源代码"涉及的知识点包括Android JNI的使用、AES加密算法的实现、NDK开发环境的配置、C/C++与Java的交互,以及数据安全和性能优化。通过这样的实现,开发者可以在Android应用中...

    Android RSA AES 加密库

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

    iOS与Android通用AES加密

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

    android ios 通用 AES加密

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

    本地图片AES加密解密

    - **多层加密**:除了AES,可以结合其他加密技术,如哈希函数和非对称加密,增加一层防护。 - **完整性校验**:计算并保存加密前的哈希值,解密后对比哈希值,确保数据未被篡改。 综上所述,本地图片AES加密解密是...

    AES加密 – Java与android、iOS、js的同步实现

    AES加密是一种广泛应用于数据安全领域...总之,理解AES加密的核心原理,并在Java、Android、iOS及JavaScript上实现同步操作,是保障多平台数据安全的基础。开发者应深入学习并实践这些技术,确保应用中的信息安全无虞。

    android AES rsa 混合加密

    在Android中,可以使用Java的`javax.crypto.Cipher`类来实现AES加密。首先,生成一个随机的AES密钥,然后使用这个密钥对数据进行加密。 2. **RSA公钥加密AES密钥**: AES加密后的密文相对安全,但AES密钥本身仍然...

    android jni 加密demo

    在这个"android jni 加密demo"中,开发者使用JNI来实现多种加密算法,包括RSA、3DES、AES、MD5以及BASE64,这些都是信息安全领域常用的加密和哈希方法。以下是对这些技术的详细解释: 1. **RSA**:RSA是一种非对称...

    android AES DES MD5加密

    在Android中,可以使用Java的javax.crypto包来实现AES加密。首先,需要生成一个随机密钥,然后使用这个密钥对数据进行加密。解密时,用相同的密钥将加密后的数据还原。AES的优点在于它的高效性和安全性,但缺点是...

    uniapp 前后端AES加密解密.rar

    本压缩包"uniapp 前后端AES加密解密.rar"正是为了解决这一问题,它包含了在uniapp环境下实现前后端AES加密解密的方法。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,具有...

    android使用AES加密对文件进行前中后三段2M长度加密

    在Android平台上,对大文件进行安全传输或存储时,通常会采用加密技术来保护数据的安全。本示例中,我们关注的是使用AES(Advanced Encryption Standard)加密算法对文件进行分段加密,特别是针对2M长度的文件片段...

    Android使用AES加密解密准确版下载。每次加密的密文结果不一样?能加密但解密不出原文?看这里就对了

    在Android平台上进行数据安全存储或传输时,加密技术起着至关重要的作用。本文将深入探讨如何使用AES(Advanced Encryption Standard)加密算法实现准确且可逆的加密解密过程。AES是一种广泛采用的对称加密标准,它...

    android的JNI获得签名及AES加密方法

    在这个主题中,我们将深入探讨如何在Android的JNI层获取签名以及实现AES加密。 首先,让我们了解如何在JNI中获取签名。在Android应用中,签名主要用于验证应用的身份,确保其来源可靠。在JNI中获取签名,通常是为了...

    Android aes密码加密

    综上所述,Android AES加密的实现涉及到密钥生成、加密解密流程、兼容性处理、密钥存储以及错误管理等多个方面。通过合理的编程实践,可以确保在各种Android设备上实现可靠且安全的数据加密。对于开发者来说,理解并...

    AES加密类模块

    AES加密标准最初由比利时密码学家Joan Daemen和Vincent Rijmen设计,后在2001年被美国国家标准与技术研究所(NIST)采纳为新的数据加密标准,替代了DES。AES支持128、192和256位的密钥长度,以及128位的数据块大小。...

    Android数据加密之Aes加密

    在Android中实现AES加密,通常需要以下步骤: 1. **生成Key**:为了进行AES加密,首先要生成一个密钥。`generateKey()`函数使用了`SecureRandom`类生成一个随机的20字节密钥,然后将其转换为16进制字符串。在4.2及...

    aes对称加密所需jar

    在IT行业中,对称加密是一种常见的数据保护方法,AES(Advanced ...这不仅涉及到技术实现,也包括了软件包管理、配置调整以及可能的代码修改。理解AES加密的工作原理和正确使用这些库是保证项目数据安全的重要环节。

    Android AES加密工具类分享

    在Android开发中,安全传输和存储数据是至关重要的,为此,开发者常常采用加密技术来保护敏感信息。本文将详细介绍一个基于AES(Advanced Encryption Standard)加密的Android工具类,该类实现了PKCS5Padding填充...

    android AES加密

    在Android中实现AES加密,通常需要以下步骤: 1. **密钥生成**:首先,你需要生成一个AES密钥。这可以通过KeyGenerator类实现,指定算法为"AES"。密钥生成器会根据你选择的密钥长度(128、192或256位)生成随机密钥...

    AES256加密

    AES256加密是一种强大的对称加密算法,用于保护数据的隐私性和安全性。...然而,任何加密技术都不是绝对安全的,用户还需要结合其他安全措施,如安全编程、定期更新软件和安全策略,以确保数据的全面保护。

Global site tag (gtag.js) - Google Analytics