導航:首頁 > 文檔加密 > 安卓aes加密文本

安卓aes加密文本

發布時間:2022-07-10 20:24:47

『壹』 androidjava 通用的加密解密方式有幾種

移動端越來越火了,我們在開發過程中,總會碰到要和移動端打交道的場景,比如.NET和android或者iOS的打交道。為了讓數據交互更安全,我們需要對數據進行加密傳輸。今天研究了一下,把幾種語言的加密都實踐了一遍,實現了.NET,java(android),iOS都同一套的加密演算法,下面就分享給大家。
AES加密有多種演算法模式,下面提供兩套模式的可用源碼
加密方式:
先將文本AES加密
返回Base64轉碼
解密方式:
將數據進行Base64解碼
進行AES解密
一、CBC(Cipher Block Chaining,加密塊鏈)模式
是一種循環模式,前一個分組的密文和當前分組的明文異或操作後再加密,這樣做的目的是增強破解難度.
密鑰
密鑰偏移量
java/adroid加密AESOperator類:

package com.bci.wx.base.util;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
* AES 是一種可逆加密演算法,對用戶的敏感信息加密處理 對原始數據進行AES加密後,在進行Base64編碼轉化;
*/
public class AESOperator {

/*
* 加密用的Key 可以用26個字母和數字組成 此處使用AES-128-CBC加密模式,key需要為16位。
*/
private String sKey = "smkldospdosldaaa";//key,可自行修改
private String ivParameter = "0392039203920300";//偏移量,可自行修改
private static AESOperator instance = null;

private AESOperator() {

}

public static AESOperator getInstance() {
if (instance == null)
instance = new AESOperator();
return instance;
}

public static String Encrypt(String encData ,String secretKey,String vector) throws Exception {

if(secretKey == null) {
return null;
}
if(secretKey.length() != 16) {
return null;
}
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] raw = secretKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密演算法的強度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);// 此處使用BASE64做轉碼。
}

// 加密
public String encrypt(String sSrc) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密演算法的強度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);// 此處使用BASE64做轉碼。
}

// 解密
public String decrypt(String sSrc) throws Exception {
try {
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}

public String decrypt(String sSrc,String key,String ivs) throws Exception {
try {
byte[] raw = key.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}

public static String encodeBytes(byte[] bytes) {
StringBuffer strBuf = new StringBuffer();

for (int i = 0; i < bytes.length; i++) {
strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
}

return strBuf.toString();
}

『貳』 C# AES加密,現在需要在java(安卓)端進行解密和加密操作,怎麼寫

例如a+=b相當於a=a+b,,,,即把a+b的值再賦值給a
懂了嗎看
不懂聯系我

『叄』 求解釋這段安卓代碼中的AES加密流程

AES加密過程涉及到 4 種操作,分別是位元組替代、行移位、列混淆和輪密鑰加。

1.位元組替換:位元組代替的主要功能是通過S盒完成一個位元組到另外一個位元組的映射。

2.行移位:行移位的功能是實現一個4x4矩陣內部位元組之間的置換。


4.輪密鑰加:加密過程中,每輪的輸入與輪密鑰異或一次(當前分組和擴展密鑰的一部分進行按位異或);因為二進制數連續異或一個數結果是不變的,所以在解密時再異或上該輪的密鑰即可恢復輸入。

5.密鑰擴展:其復雜性是確保演算法安全性的重要部分。當分組長度和密鑰長度都是128位時,AES的加密演算法共迭代10輪,需要10個子密鑰。AES的密鑰擴展的目的是將輸入的128位密鑰擴展成11個128位的子密鑰。AES的密鑰擴展演算法是以字為一個基本單位(一個字為4個位元組),剛好是密鑰矩陣的一列。因此4個字(128位)密鑰需要擴展成11個子密鑰,共44個字。

『肆』 如何在Android中用AES給zip文件加密解密

看看這個,應該有用http://blog.csdn.net/zjclugger/article/details/34838447

『伍』 AES加密 在PC上和Android上不一樣 怎麼解決

你沒有指定RNG的Provider
未指定的情況下 Android 2.3以上版本使用的是 隨機數序列是 Android's OpenSSL-backed security provider
以下版本是 BouncyCastle Security Provider

JDK 1.7內沒有這個Provider, 這個Android自己搞的,你服務端一定解不出來的。

目前Android支持的 RNG有以下幾種

Android's OpenSSL-backed security provider 1ASN.1, DER, PkiPath, PKCS7
BouncyCastle Security Provider v1.49 HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature) Harmony JSSE Provider Android KeyStore security provider
服務端如果也沒指定的話,默認使用的是

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
Oracle JDK 1.7 環境下 支持以下

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
Sun RSA signature provider
Sun Elliptic Curve provider (EC, ECDSA, ECDH)
Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
Sun (Kerberos v5, SPNEGO)
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
Sun PC/SC provider
Sun's Microsoft Crypto API provider

你們服務端要是用的 什麼 OPENJDK 第三方虛擬機,php什麼的話,那就只有天知道支不支持了。

不過你看也知道了 JDK里的都是SUN自己搞的, Android JVM里掛載的不是Android專用的就是第三方開源的,我估計你是找不到一樣的 隨機數生成器 方案了

『陸』 android 中如何用AES演算法加密解密zip文件,我的程序可以加密文本,但是zip格式的文件不行

可能是I/O流的文件格式問題,至於怎麼做,還真沒去嘗試過。 一般zip是自帶加密方式的,壓縮文件是可以使用java程序加密的,你還是自己找找吧,我不會,我只看過AES加密方法 ,O(∩_∩)O~

『柒』 為什麼windows下aes解密android上的加密文件失敗

你的Cipher生成好像缺了很多步聚,而且如果只需要加/解密,用CipherInputStream和CipherOutputStream應該更方便。
我把你的代碼完整改了一下(幾乎面目全非)。已包含加密和解密的方法,一套即用。除了Cipher生成那方法比較難明外,其他部份都很簡單,相信你一看就明。

『捌』 安卓短使用了AES加密 服務端是servlet 以前發送請求的時候是name=小明&age=12

隨著密碼分析技術的提高,新的數據加密標准AES取代了過時的DES。文章在闡述AES/RSA加密演算法的基礎上,分別給出了利用AES/RSA實現客戶端/伺服器端網路數據傳輸的加密流程。最後在比較AES演算法和RSA演算法基礎上,將AES與RSA相結合提出一種新的數據加密方案。

基本需求及概念
隨著Internet網的廣泛應用,信息安全問題日益突出,以數據加密技術為核心的信息安全技術也得到了極大的發展。目前的數據加密技術根據加密密鑰類型可分私鑰加密(對稱加密)系統和公鑰加密(非對稱加密)系統[1]。對稱加密演算法是較傳統的加密體制,通信雙方在加/解密過程中使用他們共享的單一密鑰,鑒於其演算法簡單和加密速度快的優點,目前仍然是主流的密碼體制之一。最常用的對稱密碼演算法是數據加密標准(DES)演算法,但是由於DES密鑰長度較短,已經不適合當今分布式開放網路對數據加密安全性的要求。最後,一種新的基於Rijndael演算法對稱高級數據加密標准AES取代了數據加密標准DES。非對稱加密由於加/解密鑰不同(公鑰加密,私鑰解密),密鑰管理簡單,也得到廣泛應用。RSA是非對稱加密系統最著名的公鑰密碼演算法。
AES演算法
基本原理及演算法流程
美國國家標准和技術研究所(NIST)經過三輪候選演算法篩選,從眾多的分組密碼中選中Rijndael演算法作為高級加密標准(AES)。Rijndael密碼是一個迭代型分組密碼,分組長度和密碼長度都是可變的,分組長度和密碼長度可以獨立的指定為128比特,192比特或者256比特。AES的加密演算法的數據處理單位是位元組,128位的比特信息被分成16個位元組,按順序復制到一個4*4的矩陣中,稱為狀態(state),AES的所有變換都是基於狀態矩陣的變換。
用Nr表示對一個數據分組加密的輪數(加密輪數與密鑰長度的關系如表1所示)。在輪函數的每一輪迭代中,包括四步變換,分別是位元組代換運算(ByteSub())、行變換(ShiftRows())、列混合(MixColumns())以及輪密鑰的添加變換AddRoundKey()[3],其作用就是通過重復簡單的非線形變換、混合函數變換,將位元組代換運算產生的非線性擴散,達到充分的混合,在每輪迭代中引入不同的密鑰,從而實現加密的有效性。
表1 是三種不同類型的AES加密密鑰分組大小與相應的加密輪數的對照表。加密開始時,輸入分組的各位元組按表2 的方式裝入矩陣state中。如輸入ABCDEFGHIJKLMNOP,則輸入塊影射到如表2的狀態矩陣中。

『玖』 Android在用AES加密字元串之後再用base64加密,加密的結果跟ios端不一樣,

之前在項目上用到AES256加密解密演算法,剛開始在java端加密解密都沒有問題,在iOS端加密解密也沒有問題。但是奇怪的是在java端加密後的文件在iOS端無法正確解密打開,然後簡單測試了一下,發現在java端和iOS端採用相同明文,相同密鑰加密後的密文不一樣!上網查了資料後發現iOS中AES加密演算法採用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我們知道加密演算法由演算法+模式+填充組成,所以這兩者不同的填充演算法導致相同明文相同密鑰加密後出現密文不一致的情況。那麼我們需要在java中用PKCS7Padding來填充,這樣就可以和iOS端填充演算法一致了。
要實現在java端用PKCS7Padding填充,需要用到bouncycastle組件來實現,下面我會提供該包的下載。啰嗦了一大堆,下面是一個簡單的測試,上代碼!
001 package com.encrypt.file;
002
003
004 import java.io.UnsupportedEncodingException;
005 importjava.security.Key;
006 import java.security.Security;
007
008 importjavax.crypto.Cipher;
009 importjavax.crypto.SecretKey;
010 importjavax.crypto.spec.SecretKeySpec;
011
012 public classAES256Encryption{
013
014 /**
015 * 密鑰演算法
016 * java6支持56位密鑰,bouncycastle支持64位
017 * */
018 public static finalString KEY_ALGORITHM="AES";
019
020 /**
021 * 加密/解密演算法/工作模式/填充方式
022 *
023 * JAVA6 支持PKCS5PADDING填充方式
024 * Bouncy castle支持PKCS7Padding填充方式
025 * */
026 public static finalString CIPHER_ALGORITHM="AES/ECB/PKCS7Padding";
027
028 /**
029 *
030 * 生成密鑰,java6隻支持56位密鑰,bouncycastle支持64位密鑰
031 * @return byte[] 二進制密鑰
032 * */
033 public static byte[] initkey() throwsException{
034
035 // //實例化密鑰生成器
036 // Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC");
038 // //初始化密鑰生成器,AES要求密鑰長度為128位、192位、256位
039 //// kg.init(256);
040 // kg.init(128);
041 // //生成密鑰
042 // SecretKey secretKey=kg.generateKey();
043 // //獲取二進制密鑰編碼形式
044 // return secretKey.getEncoded();
045 //為了便於測試,這里我把key寫死了,如果大家需要自動生成,可用上面注釋掉的代碼
046 return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c,
047 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07, 0x0a, 0x04, 0x0f,
048 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09,
049 0x06, 0x07, 0x09, 0x0d };
050 }
051
052 /**
053 * 轉換密鑰
054 * @param key 二進制密鑰
055 * @return Key 密鑰
056 * */
057 public static Key toKey(byte[] key) throwsException{
058 //實例化DES密鑰
059 //生成密鑰
060 SecretKey secretKey=newSecretKeySpec(key,KEY_ALGORITHM);
061 returnsecretKey;
062 }
063
064 /**
065 * 加密數據
066 * @param data 待加密數據
067 * @param key 密鑰
068 * @return byte[] 加密後的數據
069 * */
070 public static byte[] encrypt(byte[] data,byte[] key) throwsException{
071 //還原密鑰
072 Key k=toKey(key);
073 /**
074 * 實例化
075 * 使用 PKCS7PADDING 填充方式,按如下方式實現,就是調用bouncycastle組件實現
076 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
077 */
078 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM, "BC");
080 //初始化,設置為加密模式
081 cipher.init(Cipher.ENCRYPT_MODE, k);
082 //執行操作
083 returncipher.doFinal(data);
084 }
085 /**
086 * 解密數據
087 * @param data 待解密數據
088 * @param key 密鑰
089 * @return byte[] 解密後的數據
090 * */
091 public static byte[] decrypt(byte[] data,byte[] key) throwsException{
092 //歡迎密鑰
093 Key k =toKey(key);
094 /**
095 * 實例化
096 * 使用 PKCS7PADDING 填充方式,按如下方式實現,就是調用bouncycastle組件實現
097 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
098 */
099 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
100 //初始化,設置為解密模式
101 cipher.init(Cipher.DECRYPT_MODE, k);
102 //執行操作
103 returncipher.doFinal(data);
104 }
105 /**
106 * @param args
107 * @throws UnsupportedEncodingException
108 * @throws Exception
109 */
110 public static void main(String[] args) {
111
112 String str="AES";
113 System.out.println("原文:"+str);
114
115 //初始化密鑰
116 byte[] key;
117 try {
118 key = AES256Encryption.initkey();
119 System.out.print("密鑰:");
120 for(int i = 0;i<key.length;i++){
121 System.out.printf("%x", key[i]);
122 }
123 System.out.print("\n");
124 //加密數據
125 byte[] data=AES256Encryption.encrypt(str.getBytes(), key);
126 System.out.print("加密後:");
127 for(int i = 0;i<data.length;i++){
128 System.out.printf("%x", data[i]);
129 }
130 System.out.print("\n");
131
132 //解密數據
133 data=AES256Encryption.decrypt(data, key);
134 System.out.println("解密後:"+newString(data));
135 } catch (Exception e) {
136 // TODO Auto-generated catch block
137 e.printStackTrace();
138 }
139
140 }
141 }
運行程序後的結果截圖:

ViewController.m文件

01 //
02 // ViewController.m
03 // AES256EncryptionDemo
04 //
05 // Created by 孫 裔 on 12-12-13.
06 // Copyright (c) 2012年 rich sun. All rights reserved.
07 //
08
09 #import "ViewController.h"
10 #import "EncryptAndDecrypt.h"
11
12 @interface ViewController ()
13
14 @end
15
16 @implementation ViewController
17 @synthesize plainTextField;
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21 // Do any additional setup after loading the view, typically from a nib.
22 }
23
24 - (void)didReceiveMemoryWarning
25 {
26 [super didReceiveMemoryWarning];
27 // Dispose of any resources that can be recreated.
28 }
29 //這個函數實現了用戶輸入完後點擊視圖背景,關閉鍵盤
30 - (IBAction)backgroundTap:(id)sender{
31 [plainTextField resignFirstResponder];
32 }
33
34 - (IBAction)encrypt:(id)sender {
35
36 NSString *plainText = plainTextField.text;//明文
37 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
38
39 //為了測試,這里先把密鑰寫死
40 Byte keyByte[] = {0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0x01,0x03,0x09,0x07,0x0c,0x03,
41 0x07,0x0a,0x04,0x0f,0x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,
42 0x06,0x07,0x09,0x0d};
43 //byte轉換為NSData類型,以便下邊加密方法的調用
44 NSData *keyData = [[NSData alloc] initWithBytes:keyByte length:32];
45 //
46 NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyData];
47 Byte *plainTextByte = (Byte *)[cipherTextData bytes];
48 for(int i=0;i<[cipherTextData length];i++){
49 printf("%x",plainTextByte[i]);
50 }
51
52 }
53 @end

『拾』 用AES演算法對整個文件加密,怎麼做

1.加密,是以某種特殊的演算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法了解信息的內容。例如對稱演算法亦或加密。

2.什麼是異或演算法
異或的特點是原始值經過兩次異或某一個數後會變成原來的值,所以有時利用這個特性來進行加密,加密端把數據與一個密鑰進行異或操作,生成密文。接收方收到密文後利用加密方提供的密鑰進行再次異或操作就能得到明文。

3.常式:
/*以DWORD為單位對文件進行加密,將每個DWORD與0xfcba0000(密鑰)做異或,寫入另一個文件*/
#include <stdio.h>
#include <stdlib.h>
#define DWORD unsigned long
#define BYTE unsigned char
#define false 0
#define true 1
int main(int argc, char *argv[])
{
FILE *hSource;
FILE *hDestination;

DWORD dwKey=0xfcba0000;
char* pbBuffer;
DWORD dwBufferLen=sizeof(DWORD);
DWORD dwCount;
DWORD dwData;
if(argv[1]==0||argv[2]==0)
{
printf("missing argument!\n");
return false;
}

閱讀全文

與安卓aes加密文本相關的資料

熱點內容
cnc玻璃精雕機編程 瀏覽:311
電腦復制中途改文件夾名字 瀏覽:496
批處理轉exe反編譯工具 瀏覽:74
pdf怎麼換成圖片 瀏覽:323
換位加密能夠按照一定 瀏覽:388
安卓開發入門pdf 瀏覽:190
日醫pdf 瀏覽:861
指定文件夾換壁紙 瀏覽:898
天玥伺服器是什麼架構 瀏覽:236
蘋果為什麼回購安卓手機 瀏覽:87
27歲程序員發型 瀏覽:196
圖庫文件夾是什麼意思 瀏覽:532
空調壓縮機隔音 瀏覽:351
簿荷閱讀app為什麼登陸不了 瀏覽:516
zigbee與單片機通信 瀏覽:439
下載伺服器錯誤怎麼辦 瀏覽:652
pdf讀取庫 瀏覽:483
如何找到底層演算法 瀏覽:329
小宅z3下載什麼app 瀏覽:816
快速列印pdf 瀏覽:636