javaaes加密cbc
⑴ iOS AES加密
AES:(Advanced Encryption Standard)高級加密標准。是一個對稱分組秘鑰演算法,旨在取代 DES 成為廣泛使用的標准。
秘鑰長度 有三種,分別是 AES-128、AES-192 和 AES-256。
加密模式 有四種,分別是 ECB(Elecyronic Code Book,電子密碼本)、CBC(Cipher Block Chaining,加密塊鏈)、CFB(Cipher FeedBack Mode,加密反饋)、OFB(Output FeedBack,輸出反饋)。
填充模式:
由於塊加密只能對特定長度的數據塊進行加密,因此CBC、ECB模式需要在最後一數據塊加密前進行數據填充。(CFB,OFB和CTR模式由於與清掘key進行加密操作的是上一塊加密後的密文,因此不需要對最後一段明文進行填充)
在iOS SDK中提供了PKCS7Padding,而JDK則提供了PKCS5Padding。原則上PKCS5Padding限制了填充的Block Size為8 bytes,而java實際上當塊大於該值時,其PKCS5Padding與PKCS7Padding是相等的。
初始向量(偏移量)
使用除ECB以外的其他加密模式均需要傳入一個初始答蘆核向量,其大小與Block Size相等(AES的Block Size為128 bits(16位元組)),而兩個平台的API文檔均指明當不傳入初始向量時,系統將默認使用一個全0的初始向量。
秘鑰長度、加密模式、填充方式、初始向量(也稱偏移量,ECB模式不需要)
AES加密:數據需要進行分組,每組是16個位元組,不足16個位元組需要根據填充方式進行不同的填充,秘鑰長度可以是128位(16位元組)、192位(24位元組)、256位(32位),ECB模式不需要偏移量iv,CBC模式等其他模式需要偏移量iv,由於偏移量iv是用來與第一組數據進嘩漏行異或操作,所以長度應該和每組的長度一致,長度為16個位元組。
漫畫:什麼是 AES 演算法?
漫畫:AES 演算法的底層原理
AES加密 - iOS與Java的同步實現
iOS AES加密(主要使用CFB模式)
⑵ Java和js使用AES/CBC/PKCS5Padding(或者7)得到相同的密文
首先准備一份明文和秘鑰:
var plaintText = 'aaaaaaaaaaaaaaaa'; // 明文
var keyStr = 'bbbbbbbbbbbbbbbb'; // 一般key為一個字元串
參看官網文檔,AES方法是支持AES-128、AES-192和AES-256的,加密過程中使用哪種加密方式取決於傳入key的類型,否則就會按照AES-256的方式加密。
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
由於Java就是按照128bit給的,但是由於是一個字元串,需要先在前端將其轉為128bit的才行。
⑶ android,java 通用的加密解密方式有幾種
移動端越來越火了,我們在開發過程中,總會碰到要和移動端打交道的場景,比如.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();
}
⑷ 為什麼沒有Java實現的Aes加密演算法
需要依賴Java加密擴展的支持才能實現。
用Java實現AES需要依賴Java加密擴展TheJavaCryptographyExtension,簡稱JCE的支持主要是在javax下面的一些包。根據描述需要使用的演算法為AESCBCNoPadding。
Java語言的語法與C語言和C加加語言很接近,使得大多數程序員很容易學習和使用。另一方面,Java丟棄了C加加中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,而是引用。並提供了自動分配和回收內存空間,使得程序員不必為內存管理而擔憂。
⑸ java aes加密與網上在線加密不同。誰能告訴我為什麼求個正確的例子,謝謝了!
Cipher.getInstance("AES/ECB/PKCS5Padding");
就是這個東西有很多標準的,你得看下線上用的是什麼標准
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
⑹ IOS AES加密
AES加密有四種工作模式:ECB、CBC、CFB和OFB,其中IOS支持ECB(kCCOptionPKCS7Padding 對應Java中的kCCOptionPKCS5Padding)和CBC(kCCOptionECBMode)
AES是開發中常用的加密演算法之一。然而由於前後端開發使用的語言不統一,導致經常出現前端加密而後端不能解密的情況出現。然而無論什麼語言系統,AES的演算法總是相同的, 因此導致結果不一致的原因在於 加密設置的參數不一致 。於是先來看看在兩個平台使用AES加密時需要統一的幾個參數。
參考: https://welkinx.com/2016/07/30/10/
ios中使用AES128位 ECB模式加密 結果轉換16進制
https://tieba..com/p/4581819586
與伺服器通訊的時候,除了確定密鑰外,加密模式和填充方式也要確定。第一個例子中,就是使用了kCCOptionPKCS7Padding加密模式,並且有IV(初始向量),而第二個例子中使用了ECB(沒有補碼方式)。
此外也要注意轉碼後的密文是轉成16進制,還是base64編碼。
參考鏈接:
http://blog.51cto.com/ciphertext/1420338
https://welkinx.com/2016/07/30/10/
https://tieba..com/p/4581819586