C中带CBC-MAC的AES 128

C中带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 =

下面显示的代码是带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 = 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值执行时间常数比较。