C中带CBC-MAC的AES 128
下面显示的代码是带CBC模式实现的AES。我对网络安全方面非常陌生。我想知道如何在块上添加mac生成功能,并使其成为cbc macC中带CBC-MAC的AES 128,c,encryption,cryptography,cbc-mode,cbc-mac,C,Encryption,Cryptography,Cbc Mode,Cbc Mac,下面显示的代码是带CBC模式实现的AES。我对网络安全方面非常陌生。我想知道如何在块上添加mac生成功能,并使其成为cbc mac static void GenerateDecryptionKey(uint8_t *key) { CRYCONLbits.CRYON = 0b1; //Turn module on CRYCONHbits.KEYSRC = 0b000; //Select the key source (CRYKEY) CRYCONLbits.OPMOD =
static void GenerateDecryptionKey(uint8_t *key)
{
CRYCONLbits.CRYON = 0b1; //Turn module on
CRYCONHbits.KEYSRC = 0b000; //Select the key source (CRYKEY)
CRYCONLbits.OPMOD = 0b0010; //Select the operational mode (AES Decryption Key Expansion)
CRYCONLbits.CPHRSEL = 0b1; //Select the cipher (AES)
//(AES decryption key generation)
CRYCONHbits.KEYMOD = 0b00; //Set the key strength (128-bit key)
memcpy((void *)&CRYKEY0, key, 16); //Load the key into CRYKEY
//(128-bit key in this example)
CRYCONLbits.CRYGO = 0b1; //Start the encryption
while (CRYCONLbits.CRYGO == 0b1)
;
}
// For 128-bit key and 128-bit block size
void EncryptBlocks(
CIPHER_MODE mode,
uint8_t *key,
uint8_t *iv,
uint8_t *plaintext,
uint8_t *ciphertext,
int numblocks)
{
CRYCONLbits.CRYON = 1; //Turn module on
CRYCONHbits.KEYSRC = 0b0000; //Select the key source (CRYKEY)
CRYCONLbits.OPMOD = 0b0000; //Select operational mode (Encryption)
CRYCONLbits.CPHRSEL = 1; //Select cipher engine (AES)
CRYCONLbits.CPHRMOD = 0b001 ; //Select encryption mode
CRYCONHbits.KEYMOD = 0; //Set key strength to 128-bit
memcpy((void*)&CRYKEY0, key, 16); //Load the 128-bit key into CRYKEY
memcpy((void*)&CRYTXTB0, iv, 16); //Load the 128-bit initial vector (IV)
int i;
for (i = 0; i < numblocks; i += 16) {
//Load the next plaintext block into CRYTXTA
memcpy((void*)&CRYTXTA0, plaintext+ i, 16);
//Start the encryption
CRYCONLbits.CRYGO = 0b1;
// Wait for completion
while (CRYCONLbits.CRYGO == 0b1)
;
//Read the results out of CRYTXTB
memcpy(ciphertext+i, (void*)&CRYTXTB0, 16);
}
}
// For 128-bit key and 128-bit block size
void DecryptBlocks(
CIPHER_MODE mode,
uint8_t *key,
uint8_t *ciphertext,
uint8_t *plaintext,
int numblocks)
{
GenerateDecryptionKey(key);
CRYCONLbits.CRYON = 1; //Turn module on
CRYCONHbits.KEYSRC = 0b0000; //Select the key source (CRYKEY)
CRYCONLbits.OPMOD = 0b0001; //Select operational mode (Decryption)
CRYCONLbits.CPHRSEL = 1; //Select cipher engine (AES)
CRYCONLbits.CPHRMOD = 0b001; //Select decryption mode (CBC)
CRYCONHbits.KEYMOD = 0; //Set key strength to 128-bit
int i;
for (i = 0; i < numblocks; i+= 16) {
//Load the next plaintext block into CRYTXTA
memcpy((void*)&CRYTXTA0, plaintext+i, 16);
//Start the encryption
CRYCONLbits.CRYGO = 0b1;
// Wait for completion
while (CRYCONLbits.CRYGO == 0b1)
;
//Read the results out of CRYTXTB
memcpy(ciphertext+i, (void*)&CRYTXTB0, 16);
}
}
static void GenerateDecryptionKey(uint8_t*key)
{
CRYCONLbits.CRYON=0b1;//打开模块
CRYCONHbits.KEYSRC=0b000;//选择密钥源(CRYKEY)
CRYCONLbits.OPMOD=0b0010;//选择操作模式(AES解密密钥扩展)
CRYCONLbits.CPHRSEL=0b1;//选择密码(AES)
//(AES解密密钥生成)
CRYCONHbits.KEYMOD=0b00;//设置密钥强度(128位密钥)
memcpy((void*)&CRYKEY0,key,16);//将密钥加载到CRYKEY中
//(本例中为128位密钥)
CRYCONLbits.CRYGO=0b1;//启动加密
while(CRYCONLbits.CRYGO==0b1)
;
}
//用于128位密钥和128位块大小
无效加密块(
密码模式,
uint8_t*键,
uint8_t*iv,
uint8_t*纯文本,
uint8_t*密文,
整数(锁)
{
CRYCONLbits.CRYON=1;//打开模块
CRYCONHbits.KEYSRC=0b0000;//选择密钥源(CRYKEY)
CRYCONLbits.OPMOD=0b0000;//选择操作模式(加密)
CRYCONLbits.CPHRSEL=1;//选择密码引擎(AES)
CRYCONLbits.CPHRMOD=0b001;//选择加密模式
CRYCONHbits.KEYMOD=0;//将密钥强度设置为128位
memcpy((void*)&CRYKEY0,key,16);//将128位密钥加载到CRYKEY中
memcpy((void*)&CRYTXTB0,iv,16);//加载128位初始向量(iv)
int i;
对于(i=0;i
部分测试代码如下所示
EncryptBlocks(mode, AES_KEY, 0, plaintext, ciphertext, numblocks);
//EncryptBlocks(mode, AES_KEY, 0, plaintext, ciphertext, numblocks);//iv=0; for ECB mode
//LED1 = 0;
printf("Encrypted block:");
for (i = 0; i < numblocks; i++) {
base = i*16;
printf("\n");
for (j = base; j < base+16; j++) {
printf(" %02X", ciphertext[j]);
last[0] = ciphertext[j];
}
}
printf("\n\n");
for (i = 0; i < 16; i++) {
iv[i] = 0;
}
for(i=0;i<sizeof(plaintext);i++)
plaintext[i] = 0;
DecryptBlocks(mode, AES_KEY, ciphertext, plaintext, numblocks);
printf("Decrypted block: ");
for (i = 0; i < numblocks; i++)
{
base = i*16;
printf("\n");
for (j = base; j < base+16; j++) {
printf(" %02X", plaintext[j]);
}
}
printf("\n");
}
加密块(模式、AES_密钥、0、明文、密文、数字锁);
//加密块(模式、AES_密钥、0、明文、密文、数字锁)//iv=0;欧洲央行模式
//LED1=0;
printf(“加密块:”);
对于(i=0;i 对于(i=0;如果我可以问的话,我说什么是CRYCON?它是一个PIC24设备,CRYCONL是一个控制寄存器,加密/解密在CRYCONL寄存器中以首字母命名。有四个寄存器空间用于加密数据和密钥存储:CRYTXTA/B/C和CRYKEYbtw,这是在一个微芯片PIC套件上实现的。我看到你在你的问题上付出了努力,但是最后,它似乎只是对代码的请求。CBC-MAC相当容易实现。要记住三件事:CBC-MAC仅对固定长度的消息是安全的(改用CMAC),使用第二个密钥会更安全,最后,MAC的任何实现都应该在验证期间对MAC值执行时间常数比较。