Android AES加密算法及其实现

2023-11-18

       昨天老大叫我看看android加密算法。于是网上找了找,找到了AES加密算法。(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了很多,但是基本都是j2se平台的,android平台不一定支持,但是AES算法Android是自带了包的,从官方的http://developer.android.com/reference/javax/crypto/Cipher.html可以看到。

 AES加密算法是什么?大家可以自己去google,专家级程序员写好包,工程人员会用就行了。

这个例子其实是来自http://www.tutorials-android.com/learn/How_to_encrypt_and_decrypt_strings.rhtml

src目录主文件:

package com.qq;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SimpleCrypto extends Activity {
	 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).byteValue();    
	        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));    
	    } 
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String masterPassword = "a";
        String originalText = "0123456789";
        byte[] text = new byte[]{'0','1','2','3','4','5','6','7','8','9'};
        byte[] password = new byte[]{'a'};
        try {
    		String encryptingCode = SimpleCrypto.encrypt(masterPassword,originalText);
//    		System.out.println("加密结果为 " + encryptingCode);
    		Log.i("加密结果为 ",encryptingCode);
    		String decryptingCode = SimpleCrypto.decrypt(masterPassword, encryptingCode);
    		System.out.println("解密结果为 " + decryptingCode);
    		Log.i("解密结果",decryptingCode);
    	   } catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    }
    }
}

布局文件main.xml和配置文件AndroidManifest.xml默认就好了。最后结果在Log里面看,利用adb logcat > d:\1.txt定位到D盘的1.txt文件,然后用记事本打开就,查找”加密结果为“就可以看到了:

运行结果(从log日志中看到的):

I/加密结果为 (  190): BFB77D8F1E1EE9D5E252926A12659DE8

I/解密结果(  190): 0123456789

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android AES加密算法及其实现 的相关文章

  • Swift:检查 UISearchBar.text 是否包含 url

    如何检查 UISearchBar text 是否包含 URL 我想做这样的事情 if searchBar text NSTextCheckingType Link 但我收到错误 String is not convertible to NS
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • 错误:任务“:app:mergeDebugResources”执行失败。 > java.lang.ArrayIndexOutOfBoundsException(无错误消息)

    你们有人知道 Gradle 构建中的这个异常吗 Error Execution failed for task app mergeDebugResources gt java lang ArrayIndexOutOfBoundsExcept
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • Kotlin 和惯用的书写方式,基于可变值“如果不为空,则...”

    假设我们有这样的代码 class QuickExample fun function argument SomeOtherClass if argument mutableProperty null doSomething argument
  • 十六进制字符串的运行长度编码(包括换行符)

    我正在使用以下方法实现游程长度编码GZipStreamC winforms 应用程序中的类 数据以一系列由换行符分隔的字符串形式提供 如下所示 FFFFFFFF FFFFFEFF FDFFFFFF 00FFFFFF 在压缩之前 我将字符串转
  • 取消通知

    我使用Onesignal推送通知 需要取消所有onPause和onResume的通知 NotificationManager notificationManager NotificationManager getApplicationCon
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • popupBackground 与 Material Design 相关的问题

    我一直致力于将我的应用程序更新为 Material Design 我有一个使用选项卡的应用程序 由于某种原因 每当我使用 android popupBackground 设置下拉菜单颜色时 它就会崩溃 我设置了一个带有选项卡的默认项目并使用
  • 活动组代码示例

    有人可以给我一些使用活动组的示例代码吗 我的应用程序中有一些按钮 我想将活动应用于这些按钮 目前我正在使用 setVisibility 但我被告知活动组将是更好的选择 这是另一个ActivityGroup 示例项目 http richipa
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或

随机推荐

  • VS E2996 错误过多,导致IntelliSense引擎无法正常工作。其中一些错误可能在编辑器中不可见。代码没有提示

    一 错误的问题描述 二 这个问题导致的后果 后面程序中用到的很多都会显示找不到定义 三 说实话这个问题真的很坑 由于我更换了我程序的工作电脑 我在VS中属性管理器中重新配置了头文件和对应的库目录 但是这里我犯了一个小错误 就是我更换的时候
  • QT开发技巧之QTableWidget设置表头颜色字体

    1 默认的表头和内容背景字体一样不好区别 可以通过qss设置修改表头样式 2 修改后效果如下 qss代码 表格头背景色 QHeaderView section background rgb 128 255 255 font family 宋
  • vue引入阿里图标 Module parse failed: Unexpected character '�' (1:0)

    操作根据文章 https blog csdn net qq 32113629 article details 79740949 在自己跟着试了一下后报错 Module parse failed Unexpected character 1
  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • 波形图、频谱图和语谱图

    波形图 反映各质点在同一时刻不同位移的曲线 叫做波的图像 也叫做波形图 波形图用于显示测量值为均匀采集的一条或多条曲线 波形图仅绘制单值函数 即在y f x 中 各点沿x轴均匀分布 例如一个随时间变化的波形 波形图可显示包含任意个数据点的曲
  • 消息通知之系统层事件发布相关流程

    前言 Openharmony 3 1Release中存在消息通知的处理 消息通知包括系统层事件发布 消息订阅 消息投递与处理 为了开发者能够熟悉消息的处理流程 本篇文章主要介绍系统层事件发布的相关流程 整体流程 代码流程 发布消息 even
  • c++ queue用法 入门必看 超详细

    1 queue的作用 说到queue 大家一定会想到stack 同样是简单易用的数据结构之一 queue就是队列的意思 像大家日常排队一样 先排的人先用 stack则是相反的 后来的先用 这就有了queue先进先出 stack后进先出的说法
  • 解决表情包乱码

    问题描述 在 Web 应用或移动App中 我们经常需要显示表情符号 但表情符号包含许多非ASCII字符 不能直接在文本中传输 所以通常会转换为HTML实体编码进行传输和存储 如常见的微笑表情 会编码为 但是后续读取网络返回的文本内容时 如果
  • Kafka——集群

    文章目录 集群 1 搭建个集群 2 集群发送消息 3 集群消费 3 1 Procuder 3 2 Consumer 4 消费顺序 集群 对于kafka来说 一个单独的broker意味着kafka集群中只有一个节点 要想增加kafka集群中的
  • 计算机操作系统--UNIX操作系统

    UNIX操作系统 UNIX操作系统是一种多用户 多任务的分时操作系统 它由最内层的硬件提供基本服 务 内核提供全部应用程序所需的各种服务 UNIX文件系统 UNIX文件系统采用树形带交叉勾连的目录结构 根目录即为 非叶节点是目录 文件 叶节
  • DMA 突发模式

    这里的4个节拍 8个节拍 16个节拍的增量突发传输要如何解释 DMA传输需要用到总线矩阵 有个总线仲裁管理总线事务 由它来控制该谁谁用总线 普通的DMA传输可能传一个数据就必须跟总线仲裁提要求 总线仲裁才来安排传输 如果是增量突发传输 就是
  • 全局网络端口配置

    1 查询网络通路情况 curl cip cc 2 对网络进行配置 指定端口 export http proxy socks5 127 0 0 1 7890 export https proxy socks5 127 0 0 1 7890 查
  • openGL API glGenSamplers 详解

    暂时先放openGL官方文档的解释 后面我会加入中文翻译 Name glGenSamplers generate sampler object names C Specification void glGenSamplers GLsizei
  • 【开发工具】JAVA性能分析:3、超详细的JProfiler快照分析(官方中文版)

    Snapshots 快照分析 到目前为止 我们只查看了JProfiler GUI从配置文件JVM中运行的性能分析代理获取数据的实时会话 JProfiler还支持将所有分析数据写入文件的快照 在以下几种情况下 这可能是有利的 您可以自动记录分
  • Java中如何将Set转List呢?

    转自 Java中如何将Set转List呢 下文笔者讲述Java中Set转List的方法分享 如下所示 实现思路 方式1 借助ArrayList进行转换 方式2 借助List实现类的addAll 方法 例 Map
  • 栈之中缀表达式转后缀表达式

    题目描述 就是把我们平常写的运算表达式换成另外一种表达式 运算符前面两个数字执行相关操作 用图说明一下 比如3 2 gt 3 2 比如3 3 2 gt 3 3 2 再比如 3 3 2 2 3 gt 3 3 2 2 3 程序设计思路 特殊情况
  • Xftp5连接linux时,服务器发送了一个意外的数据包。received:3,expected:20

    Xftp5连接linux时 服务器发送了一个意外的数据包 received 3 expected 20的解决方法 xtfp5连接要点 主机 H 可在虚拟机中使用ifconfig进行查看 用户名使用who进行查看 解决方法 进入文本文件 cd
  • 自然语言处理spaCy--训练一个词性标注模型

    自然语言处理spaCy 训练一个词性标注模型 一 什么是词性标注 1 引入库 2 使用百度LAC模块进行词性标注 3 模型训练 完整代码 总结 一 什么是词性标注 词性标注的全称为Part Of Speech tagging 顾名思 义 词
  • Elasticsearch顶尖高手系列-快速入门篇

    快速入门篇课程介绍 Elasticsearch 是目前行业中非常热门的一个技术 Elasticsearch是一种分布式的海量数据搜索与分析的技术 可以用于电商网站 门户网站 企业IT系统等各种场景下的搜索引擎 也可以用于对海量的数据进行近实
  • Android AES加密算法及其实现

    昨天老大叫我看看android加密算法 于是网上找了找 找到了AES加密算法 当然还有MD5 BASE64什么的http snowolf iteye com blog 379860这篇文章列举了很多 但是基本都是j2se平台的 androi