ECB为什么换为GCM
时间: 2024-06-07 19:06:43 浏览: 101
ECB(Electronic Codebook)是一种基本的加密模式,每个明文块都独立加密,因此相同的明文块会得到相同的密文块,存在一定的安全问题。而GCM(Galois/Counter Mode)是一种更加安全的加密模式,它可以对明文进行认证加密,并且支持并行计算,因此在安全性和效率上都比ECB更好。另外,GCM还可以通过在加密过程中计算校验和对数据完整性进行验证,从而提高安全性。因此,ECB被GCM所取代。
相关问题
ios用openSSL实现AES-GCM和ECB加密
首先,你需要在iOS项目中添加OpenSSL库并导入头文件。可以使用CocoaPods来安装OpenSSL,也可以手动下载并添加到项目中。
在使用OpenSSL加密之前,需要先初始化库:
```
#include <openssl/evp.h>
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
```
接下来,我们可以使用EVP接口实现AES-GCM加密。以下是一个示例代码:
```
#include <openssl/rand.h>
void aes_gcm_encrypt(unsigned char *plaintext, int plaintext_len,
unsigned char *aad, int aad_len,
unsigned char *key,
unsigned char *iv, int iv_len,
unsigned char *ciphertext,
unsigned char *tag) {
EVP_CIPHER_CTX *ctx;
int len;
int ciphertext_len;
// Create and initialise the context
if (!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
// Initialise the encryption operation.
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL))
handleErrors();
// Set IV length
if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
handleErrors();
// Set tag length
if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, NULL))
handleErrors();
// Initialise key and IV
if (1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) handleErrors();
// Provide any non-AAD data
if (aad_len > 0) {
if (1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len))
handleErrors();
}
// Provide the message to be encrypted, and obtain the ciphertext
if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
handleErrors();
ciphertext_len = len;
// Finalise the encryption
if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();
ciphertext_len += len;
// Get the tag
if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
handleErrors();
// Clean up
EVP_CIPHER_CTX_free(ctx);
}
```
在此示例中,我们使用EVP_aes_128_gcm()进行AES-GCM加密。我们还提供了一个AAD(Additional Authenticated Data)参数,它是与加密数据一起传输的附加信息。最后,我们获得了加密后的密文和GCM标签。
下面是一个使用ECB模式进行加密的示例代码:
```
void aes_ecb_encrypt(unsigned char *plaintext, int plaintext_len,
unsigned char *key,
unsigned char *ciphertext) {
EVP_CIPHER_CTX *ctx;
int len;
int ciphertext_len;
// Create and initialise the context
if (!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
// Initialise the encryption operation.
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL))
handleErrors();
// Provide the message to be encrypted, and obtain the ciphertext
if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
handleErrors();
ciphertext_len = len;
// Finalise the encryption
if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();
ciphertext_len += len;
// Clean up
EVP_CIPHER_CTX_free(ctx);
}
```
在此示例中,我们使用EVP_aes_128_ecb()进行ECB加密。
这里的示例仅供参考,实际实现过程中需要根据具体情况进行调整。同时,为了保护数据安全,建议在使用OpenSSL时遵循最佳安全实践,例如使用随机生成的IV、密钥和盐值等。
ios用openSSL实现AES-GCM和ECB解密
在iOS中使用OpenSSL实现AES-GCM和ECB解密,可以按照以下步骤进行操作:
1. 下载OpenSSL库并将其添加到您的Xcode项目中。
2. 导入头文件:
```objc
#include <openssl/evp.h>
#include <openssl/aes.h>
```
3. 实现AES-GCM加密和解密:
```objc
- (NSData *)AESGCMEncrypt:(NSData *)data withKey:(NSData *)key iv:(NSData *)iv aad:(NSData *)aad {
// 初始化加密上下文
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);
// 设置密钥和IV
EVP_EncryptInit_ex(ctx, NULL, NULL, key.bytes, iv.bytes);
// 设置AAD
int outlen, tmplen;
EVP_EncryptUpdate(ctx, NULL, &outlen, aad.bytes, (int)aad.length);
// 加密数据
NSMutableData *encryptedData = [NSMutableData data];
EVP_EncryptUpdate(ctx, encryptedData.mutableBytes, &outlen, data.bytes, (int)data.length);
// 获取tag
EVP_EncryptFinal_ex(ctx, encryptedData.mutableBytes + outlen, &tmplen);
outlen += tmplen;
unsigned char tag[16];
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag);
EVP_CIPHER_CTX_free(ctx);
// 将tag添加到加密数据中
[encryptedData appendBytes:tag length:16];
return encryptedData;
}
- (NSData *)AESGCMDecrypt:(NSData *)data withKey:(NSData *)key iv:(NSData *)iv aad:(NSData *)aad {
// 初始化解密上下文
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL);
// 设置密钥和IV
EVP_DecryptInit_ex(ctx, NULL, NULL, key.bytes, iv.bytes);
// 设置AAD
int outlen, tmplen;
EVP_DecryptUpdate(ctx, NULL, &outlen, aad.bytes, (int)aad.length);
// 获取tag
unsigned char tag[16];
memcpy(tag, data.bytes + data.length - 16, 16);
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tag);
// 解密数据
NSMutableData *decryptedData = [NSMutableData data];
EVP_DecryptUpdate(ctx, decryptedData.mutableBytes, &outlen, data.bytes, (int)data.length - 16);
// 验证tag
if (EVP_DecryptFinal_ex(ctx, decryptedData.mutableBytes + outlen, &tmplen) == 0) {
EVP_CIPHER_CTX_free(ctx);
return nil;
}
outlen += tmplen;
EVP_CIPHER_CTX_free(ctx);
return decryptedData;
}
```
4. 实现ECB解密:
```objc
- (NSData *)AESDecryptECB:(NSData *)data withKey:(NSData *)key {
// 初始化解密上下文
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, key.bytes, NULL);
// 解密数据
int outlen, tmplen;
NSMutableData *decryptedData = [NSMutableData data];
EVP_DecryptUpdate(ctx, decryptedData.mutableBytes, &outlen, data.bytes, (int)data.length);
if (EVP_DecryptFinal_ex(ctx, decryptedData.mutableBytes + outlen, &tmplen) == 0) {
EVP_CIPHER_CTX_free(ctx);
return nil;
}
outlen += tmplen;
EVP_CIPHER_CTX_free(ctx);
return decryptedData;
}
```
注意:ECB模式不是安全的加密模式,建议使用更安全的加密模式,如CBC或GCM。
阅读全文