Ⅰ iOS AES128 ECB加密 對位元組數組而不是字元串怎麼進行加密
// 開發中用到AES128加密、解密
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>
@interface NSData (AES)
- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv;
- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv;
- (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv;
@end
@implementation NSData (AES)
- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
}
free(buffer);
return nil;
}
- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv
{
return [self AES128Operation:kCCEncrypt key:key iv:iv];
}
- (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv
{
return [self AES128Operation:kCCDecrypt key:key iv:iv];
}
@end
int main(int argc, char const* argv[])
{
NSAutoreleasePool* pool;
pool = [[NSAutoreleasePool alloc] init];
NSString *key = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];
NSString *iv = [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding];
NSString *data_str = [NSString stringWithCString:argv[3] encoding:NSUTF8StringEncoding];
NSData *data = [data_str dataUsingEncoding:NSUTF8StringEncoding];
NSData *en_data = [data AES128EncryptWithKey:key iv:iv];
NSData *de_data = [en_data AES128DecryptWithKey:key iv:iv];
NSString *de_str = [[[NSString alloc] initWithData:de_data
encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"%@", en_data);
NSLog(@"%@", de_str);
[pool drain];
return 0;
}
Ⅱ python中AES 用ECB模式加密之後為什麼和C#加密之後的結果不一樣
AES是美國國家標准技術研究所NIST旨在取代DES的21世紀的加密標准。 AES的基本要求是,採用對稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度128位,演算法應易於各種硬體和軟體實現。1998年NIST開始AES第一輪分析、測試和徵集
Ⅲ openssl des(ecb)加密模式的密鑰輸入問題
不用手動添加,des的密鑰就是八位,12345678就可以。
Ⅳ 在DES加密里邊,ECB和CBC有什麼區別
一、優點不同:
ECB模式
1、簡單;
2、有利於並行計算;
3、誤差不會被傳送;
CBC模式:
1、不容易主動攻擊,安全性好於ECB,適合傳輸長度長的報文,是SSL、IPSec的標准。
二、缺點不同:
ECB模式
1、不能隱藏明文的模式;
2、可能對明文進行主動攻擊;
CBC模式:
1、不利於並行計算;
2、誤差傳遞;
3、需要初始化向量IV
三、概念不同
1、ECB模式又稱電子密碼本模式:Electronic codebook,是最簡單的塊密碼加密模式,加密前根據加密塊大小(如AES為128位)分成若干塊,之後將每塊使用相同的密鑰單獨加密,解密同理。
2、密碼分組鏈接(CBC,Cipher-block chaining)模式,由IBM於1976年發明,每個明文塊先與前一個密文塊進行異或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊。同時,為了保證每條消息的唯一性,在第一個塊中需要使用初始化向量IV。
(4)ecb加密擴展閱讀:
1976年,IBM發明了密碼分組鏈接(CBC,Cipher-block chaining)模式。在CBC模式中,每個明文塊先與前一個密文塊進行異或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊。同時,為了保證每條消息的唯一性,在第一個塊中需要使用初始化向量。
若第一個塊的下標為1,則CBC模式的加密過程為:
Ci = Ek (P ⊕ Ci-1), C0 = IV.
而其解密過程則為:
Pi = Dk (Ci) ⊕Ci-1, C0 = IV.
CBC是最為常用的工作模式。它的主要缺點在於加密過程是串列的,無法被並行化,而且消息必須被填充到塊大小的整數倍。解決後一個問題的一種方法是利用密文竊取。
注意在加密時,明文中的微小改變會導致其後的全部密文塊發生改變,而在解密時,從兩個鄰接的密文塊中即可得到一個明文塊。因此,解密過程可以被並行化,而解密時,密文中一位的改變只會導致其對應的明文塊完全改變和下一個明文塊中對應位發生改變,不會影響到其它明文的內容。
Ⅳ DES和AES加密的ECB模式到底有多脆弱,不能在商業項目中使用嗎 - PHP進階討論
破解是相對的,如果開鎖的代價大於箱子裡面的東西,就沒有必要去開鎖了每個演算法都有其適用的地方的des比較簡單,運算快速,對機器要求小aes可防止傳錯,且加密後,體積不會太大,可用於傳輸大量數據
Ⅵ 即使分組加密演算法是安全的,為什麼說採用ecb方式加密依然存在不安全性
加密演算法在傳輸過程中就會有數據報文輸出,輸入,這個過程中被嗅探工具探知以後,在大數據伺服器上進行解密演算法, 算出後,就可進行攔截,偽造,等手法,讓你不知不覺中招,
所以說沒有那種加密演算法是完全安全的,只有不停的更新演算法,才能保證不被破解。這是一個長期的工作, 只有一些國際企業才有這種實力,長期進行加密演算法更新,ps(國際常用的加密演算法也就那麼幾種,自己網路搜搜)
Ⅶ AES共有ECB,CBC,CFB,OFB,CTR五種模式分別有什麼區別
轉:
JCE中AES支持五中模式:CBC,CFB,ECB,OFB,PCBC;支持三種填充:NoPadding,PKCS5Padding,ISO10126Padding。不支持SSL3Padding。不支持「NONE」模式。
其中AES/ECB/NoPadding和我現在使用的AESUtil得出的結果相同(在16的整數倍情況下)。
不帶模式和填充來獲取AES演算法的時候,其默認使用ECB/PKCS5Padding。
演算法/模式/填充
16位元組加密後數據長度 不滿16位元組加密後長度
AES/CBC/NoPadding
16
不支持
AES/CBC/PKCS5Padding
32
16
AES/CBC/ISO10126Padding
32
16
AES/CFB/NoPadding
16
原始數據長度
AES/CFB/PKCS5Padding
32
16
AES/CFB/ISO10126Padding
32
16
AES/ECB/NoPadding
16
不支持
AES/ECB/PKCS5Padding
32
16
AES/ECB/ISO10126Padding
32
16
AES/OFB/NoPadding
16
原始數據長度
AES/OFB/PKCS5Padding
32
16
AES/OFB/ISO10126Padding
32
16
AES/PCBC/NoPadding
16
不支持
AES/PCBC/PKCS5Padding
32
16
AES/PCBC/ISO10126Padding
32
16
可以看到,在原始數據長度為16的整數倍時,假如原始數據長度等於16*n,則使用NoPadding時加密後數據長度等於16*n,其它情況下加密數據長度等於16*(n+1)。在不足16的整數倍的情況下,假如原始數據長度等於16*n+m[其中m小於16],除了NoPadding填充之外的任何方式,加密數據長度都等於16*(n+1);NoPadding填充情況下,CBC、ECB和PCBC三種模式是不支持的,CFB、OFB兩種模式下則加密數據長度等於原始數據長度。
Ⅷ java用3DES加密演算法(ECB/PKCS5Padding)如何計算可以得到下面的結果
3DES需要的輸入明文長度、密文長度都是8的整數倍。
而CBC.CFB都需要初始化向量的參數才能加密、解密、。
Ⅸ 編碼 UTF8加密方式 AES 運算模式 ECB 填充模式 零位元組組成的字元串 塊大小 128(位)密文傳輸編碼 BASE64
我找到了解決我的問題。為了使加密工作,而填充我不得不補充,而不是kCCOptionPKCS7Padding或kCCOptionECBMode均會被視為為0x0000。此外,如果需要被編碼的數據不具有kCCKeySizeAES128的長度數倍(16),然後保存該數據的矢量必須被調整到具有多個長度與kCCKeySizeAES128並充滿我加空格的空值。-(NSData*)AES128EncryptWithKey:(NSString*)key{charkeyPtr[kCCKeySizeAES128+1];bzero(keyPtr,sizeof(keyPtr));[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];intdataLength=[selflength];intdiff=kCCKeySizeAES128-(dataLength%kCCKeySizeAES128);intnewSize=0;if(diff>0){newSize=dataLength+diff;}chardataPtr[newSize];memcpy(dataPtr,[selfbytes],[selflength]);for(inti=0;i
Ⅹ c#3des ecb加密模式需要iv嗎
3DES的密鑰不可能48bit吧,那安全性比普通DES更差。 密鑰高於56bit 用相同的塊操作模式CBC、ECB等 用相同的補齊方式,PKCS5/7 密鑰用相同的散列函數或擴張函數。比如md5,sha1 各方面一致,c#,java#可以互轉無誤的。