Android和。net加密。

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

  • Source Code (Android and .Net - 1.67 MB)

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

"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);

 }

在我们的加密处理器类,我们将使用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

"CryptoHandlerClassMethods">
public byte[] Encrypt(byte[] clearData)

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

"CryptoHandlerClassMethods">
public byte[] Decrypt(byte[] data)

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

"CryptoHandlerClassMethods">
public byte[] DoWork(byte[] data)

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

"CryptoHandlerClassMethods">
private byte[] encodeDigest(String text)

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

"CryptoHandlerClassMethods">
 private static byte[] _rawSecretKey =

 {
       0x12, 0x00, 0x22, 0x55, 0x33, 0x78, 0x25, 0x11,
       0x33, 0x45, 0x00, 0x00, 0x34, 0x00, 0x23, 0x28
 };

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

"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
              );

     }     
}

*如果你不知道如何查看你的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加密。)