来源: Github: https://github.com/Pavel-Durov/CodeProject-Android-and-NET-Encryption 直接:

表的内容 什么是加密? 非对称加密(公钥加密) Android中的对称加密 加密处理程序类方法 Android实现在。net摘要上解密Android消息 前言 外国人可以看到的敏感数据应该加密。 你所做的决定是很敏感的。它可以是任何个人数据,你通过网络发送的图像,你的GPS位置等等。 当敏感数据在程序外部暴露、在internet上发送或保存到本地文件系统时,它们就容易受到攻击。 本文不是关于安全性的,而是关于简单的加密/解密实现。 加密是什么? 加密是将明文转换成密文。 解密则相反;它是密码文本到纯文本,到可读格式的转换。 加密算法可分为对称和非对称两类。两者都有各自的优点和缺点。 对称加密 加密和解密由一个相同的共享密钥执行。此密钥在发送方和接收方之间共享。 为了加密消息,发送者使用共享密钥;收件人必须使用相同的密钥解密邮件。 对称算法速度非常快,但它要求两边都有一个唯一的相同密钥,这在大型系统中可能会成为一个问题,因为需要管理大量的密钥。 非对称加密(公开密钥加密) 发送方和接收方使用不同的密钥对消息进行加密和解密,每个密钥都有一对公钥和私钥。 当发送方想要加密消息时,他使用接收方的公钥。然后,接收方可以使用其私钥解密消息。这种方法速度较慢,但对于大型系统,密钥管理要容易得多。 Android中的对称加密 在本例中,我们将使用Android的SDK类Cipher进行加密/解密。 Cipher类提供对用于加密和解密的加密密码的实现的访问。更多关于这个: http://developer.android.com/reference/javax/crypto/Cipher.html , CryptoHandler类 我们的密码依赖于两个密钥,第一个是作为字符串传递给构造函数的秘钥,第二个是16字节长的原始秘钥。 , 让我们检查一下CryptoHandler类。 隐藏,收缩,复制Code

<a name="CryptoHandlerClass">
//CryptoHandler constructor public CryptoHandler(String passphrase) {
//decodes passd phrase to encrypted byte[]
byte[] passwordKey = encodeDigest(passphrase);
try
{
//_aesCipher instantiation passing transformation parameter
_aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
}
catch (NoSuchAlgorithmException e)
{ //Invalid algorithm in passed transformation parameter
Log.e(TAG, "No such algorithm " + CIPHER_ALGORITHM, e);
} catch (NoSuchPaddingException e)
{ //Invalid padding in passed transformation parameter
Log.e(TAG, "No such padding PKCS5", e);
} //Encodes the passed password phrase to a byte[]
//that will be stored in class private member of SecretKey type
_secretKey = new SecretKeySpec(passwordKey, CIPHER_ALGORITHM); //Creates a new IvParameterSpec instance with the bytes
//from the specified buffer iv used as initialization vector.
_ivParameterSpec = new IvParameterSpec(rawSecretKey); }</a>

在我们的加密处理器类,我们将使用AES(高级加密标准)加密,你可以在这里阅读更多: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard AES实例化发生在下面一行: 隐藏,复制Code

private static String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";

_aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION);

我们调用一个密码静态方法,该方法返回一个实例化的Cipher类型的对象(如果没有抛出异常)。 “AES/CBC/PKCS5Padding”(传递的字符串转换参数) , AES -加密算法(高级加密标准)。 反馈模式的名称(在我们的例子中是密码块链接)。 PKCS5Padding -填充方案的名称。 , CryptoHandler类方法 除了构造函数,我们在CryptoHandler类中还有3个其他方法: 隐藏,复制Code

<a name="CryptoHandlerClassMethods">
public byte[] Encrypt(byte[] clearData)</a>

Encrypt方法通过传递密码将_aesCipher设置为加密模式。ENCRYPT_MODE常量到init()方法。 隐藏,复制Code

<a name="CryptoHandlerClassMethods">
public byte[] Decrypt(byte[] data)</a>

Decrypt方法做同样的事情,但不是传递密码。ENCRYPT_MODE传递的是password . decrypt_mode。 解密和加密方法都调用DoWork()方法,它们之间唯一的区别是各自设置的密码模式常数。 隐藏,复制Code

<a name="CryptoHandlerClassMethods">
public byte[] DoWork(byte[] data)</a>

调用_aes . dofinal (data)方法并捕获异常。 隐藏,复制Code

<a name="CryptoHandlerClassMethods">
private byte[] encodeDigest(String text)</a>

在构造函数中用于密码短语编码一次。 私有原始密钥作为字节数组存储在类中: 隐藏,复制Code

<a name="CryptoHandlerClassMethods">
private static byte[] _rawSecretKey = {
0x12, 0x00, 0x22, 0x55, 0x33, 0x78, 0x25, 0x11,
0x33, 0x45, 0x00, 0x00, 0x34, 0x00, 0x23, 0x28
};</a>

这个密匙必须在发送方和接收方之间共享,在我们的例子中,我们同时作为它们参与,因此我们使用相同的密匙实例进行加密和解密。 安卓系统的实现 在MainActivity布局上,你可以看到两个彩色区域,蓝色的是你输入加密文本的区域,绿色的是显示文本的区域。 , 当您按下加密按钮时,加密的数据将被保存到内部文件系统(您可以在files文件夹下看到它),并在绿色视图中显示为gibberish(这是原始明文的密码文本)。 , *保存的数据将覆盖以前的数据,不会附加到文件中现有的数据。 , 隐藏,复制Code

<a name="AndroidImplementation">
/**
* Encrypts the String value that entered in the _tvMessage EditText View
* and saves is to file on local file system
* */
private void EncryptMessage()
{
String message = _tvMessage.getText().toString();
if(message != null && message.length() > 0)
{
//performs text encryption
byte[] bytes = _crypto.Encrypt(message.getBytes());
//sets view value
SetTextViewEncryptresult(bytes); //saves encrypted text to internal file
_streamHandler.SaveTextFile
(
FileStreamHandler.ENCRYPTED_TXT_FILENAME,
bytes
); }
}</a>

*如果你不知道如何查看你的Android设备内部数据,请看我的文章: http://www.codeproject.com/Articles/825304/Accessing-internal-data-on-Android-device , 所有文件操作都是通过handlers包中的FileStreamHandler执行的。 有几种方法负责读取和写入内部文件。 当您单击MainActivity布局上的Decrypt按钮时,消息将从已保存的文件中读取并显示为Toast消息。 , 隐藏,收缩,复制Code

/**
* Decrypt the message from saved local file content.
* calls ShowToast() method
* */ private void DecryptMessage() {
byte[] fileContent = _streamHandler .ReadFromLocalFile(FileStreamHandler.ENCRYPTED_TXT_FILENAME); if(fileContent != null && fileContent.length > 0)
{
//preforms decryption of the fuile content
byte[] decrypted = _crypto.Decrypt(fileContent); //Creates new String instance of passed byte[] as UTF-8
String readableData = StringHandler.GetString(decrypted);
String encrypted = StringHandler.GetString(fileContent); if(readableData != null && encrypted != null)
{
//showing toast
ShowToast
(
getString(R.string.msg_decrypted) + readableData,
getString(R.string.msg_encrypted) + encrypted );
}
}
else
{ //if file not exist or file content is empty
ShowToast(":(", "!");
}
}

如果你点击解密按钮,你会得到这样的东西: 这意味着你完成了整个密码程序。 您输入了一个纯文本,该文本被编码为密码文本并保存到本地文件中,随后将读取并解密为普通可读文本。 在本例中,我们将密钥和密码短语作为硬编码值保存在java类中,但是这不是一个最佳的解决方案,因为使用逆向工程可以很容易地检查它,所以请记住并将密钥存储在安全的地方。 在。net上解密Android消息 现在我们来看看如何破解我们在。net上使用c#语言在Android设备上加密的密码文本。这也可以在其他平台上完成,因为我们使用了标准加密。 我们将把之前在Android设备上保存的文件拉到机器上,并将其导入到Visual Studio上的基本控制台应用程序中。 好的,让我们创建文件并使用adb拉出: 步骤: 在蓝色区域输入信息并按下加密按钮。 , 现在我们的信息被加密并保存到硬盘上。 ,,,,2. 接下来,我们将运行几个命令,以获得grand文件权限和pull命令,以获得文件,设备。 , *再次,如果你不明白,请参阅我的文章adb工具和Android内部文件权限: http://www.codeproject.com/Articles/825304/Accessing-internal-data-on-Android-device 由于我所有的adb命令被成功执行,我现在可以浏览我的文件在我的下载目录: 现在我们将把它导入到。net控制台应用程序中。 *不要复制文本,我们这里处理的是二进制数据和复制它作为字符串可以改变它的值!简单地按原样复制文件。 在我们的c#控制台应用程序中,我们得到了与Android上基本相同的CryptoHandler类。注意,在。net上,我们使用了两个ICryptoTransform实例作为解密和加密机制。这几乎是一样的,因为在Android上我们使用的是常量,而这里我们使用的是rijndaelmanage.net类的工厂方法。 , 如果一切正常,运行c#程序,你会看到在Android设备上输入的相同信息: 总结 我们在Android和。net应用程序上对简单的消息进行了加密和解密。这可以作为客户端-服务器通信的一部分(Android作为客户端,. net作为服务器),使用文本或任何其他希望加密的二进制文件,除了需要处理网络上的数据转换,这一点我们在这里没有介绍。 不要运行和加密手边的所有东西,特别是在处理大型二进制文件时。这可能会降低应用程序的效率,特别是当您要保护没有人感兴趣的数据时。 本文转载于:http://www.diyabc.com/frontweb/news30752.html

Android和。net加密。的更多相关文章

  1. Android开发周报:Android L默认加密用户数据

    Android开发周报:Android L默认加密用户数据 新闻 <iCloud前车之鉴,Android L默认开启加密功能>:iCloud 艳照风波再起,第二波女星照片流出,大量女星的裸 ...

  2. wemall app商城源码android开发MD5加密工具类

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...

  3. android 对称加密,非对称加密 android 常见的加密

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android 常见的加密 ======== 不可逆加密:md5,sha1 可逆的加密中 ...

  4. android全磁盘加密

    android 全磁盘加密 什么是全磁盘加密? 全磁盘加密是使用一个密钥来为android设备上全部的用户数据加密的过程.一旦设备被加密,全部的用户创建的数据都将会在提交的磁盘之前自己主动加密,在读取 ...

  5. Android Sqlite数据库加密

    Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...

  6. android 客户端 RSA加密 要注意的问题

    针对java后端进行的RSA加密,android客户端进行解密,结果是部分乱码的问题:注意两点,编码问题和客户端使用的算法问题 即:都使用UTF-8编码,Base64使用一致,另外,使用下面的代码在后 ...

  7. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  8. Android中AES256加密的实现

    AES加密是我们在工作中常用到一种加密方式,并且在java中也已经实现好了其相应的接口. 但是Java自带的JDK默认最多实现128位及其以下的加密.如果使用java自带的api实现aes256将会报 ...

  9. Android app如何加密?

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Android App包含的内容有dex文件,so文件,res,assets资源文件.对应的加密按此内容分为三大方面:dex保护.so加密.资源保护 ...

  10. Java android DES+Base64加密解密

    服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Ba ...

随机推荐

  1. 牛顿迭代法解非线性方程组(MATLAB版)

    牛顿迭代法,又名切线法,这里不详细介绍,简单说明每一次牛顿迭代的运算:首先将各个方程式在一个根的估计值处线性化(泰勒展开式忽略高阶余项),然后求解线性化后的方程组,最后再更新根的估计值.下面以求解最简 ...

  2. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  3. 小程序开发-微信小程序开发入门

    分享一个微信小程序开发的基本流程,仅供参考. 第一步:注册微信小程序公众号,注册成功后,登录微信公众号管理后台,等待下一步操作. 第二步:进入微信小程序的后台后,下载微信内置的微信小程序开发者工具,以 ...

  4. 教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)

    在我们的生活中常常要用到各种底色要求的证件电子照,红底.蓝底.或者白底,而假如你手上只有一种底色的证件照,你又不想再去拍又不会PS怎么办?今天教你们用OpenCV和Python给你的证件照换底色. P ...

  5. 使用Java7提供的WatchService给目录添加新建文件监控

    程序: import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; import ...

  6. Mybatis项目构建和CURD操作

    Mybatis入门 一.使用SqlSession对象创建Dao接口代理对象进行持久化操作 1.使用maven构建java项目 2.修改pom.xml配置,添加所需jar包坐标 <?xml ver ...

  7. 9.下载ffmpeg、使QT支持同时编译32位和64位

    1.FFMPEG下载 进入http://ffmpeg.org/download.html,如果下载源码,则在右下方: 如果在linux中,直接输入git clone https://git.ffmpe ...

  8. 《Java从入门到失业》第四章:类和对象(4.1):初识类和对象

    4类和对象 在第一章曾经简单介绍过,在面向对象的世界里,一切事物皆对象,当解决一个问题的时候,我们先会考虑这个问题会涉及到哪些事物,然后把事物抽象成类,当时还画了一张图如下: 从本章开始,我们一点一点 ...

  9. Git 不能提交空目录?我也是醉了!

    Git 不能提交空目录?我也是醉了! 背景 最近在提交文件时,因为是空的 Maven 项目结构,发现 Git 空目录死活不能提交,还以为是我自己在 .gitignore 文件中忽略了,在网上查了下,原 ...

  10. access数据库一般注入方法及偏移注入

    1.access数据库与mysql数据库的差别 access没有数据库,access数据库每个数据都是单个文件,每个access只有表结构 mysql : 库名,表名,列名,字段内容 access:表 ...