crypt_aes.c.svn-base

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 937 行 · 第 1/3 页

SVN-BASE
937
字号
    *rk++ = *rrk++;    *rk   = *rrk;#endif /* ENCRYPT_ONLY */    return CRYPT_OK;   }/**  Encrypts a block of text with AES  @param pt The input plaintext (16 bytes)  @param ct The output ciphertext (16 bytes)  @param skey The key as scheduled  @return CRYPT_OK if successful*/int ECB_ENC(const unsigned char *pt, unsigned char *ct, symmetric_key *skey){    ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;    int Nr, r;    LTC_ARGCHK(pt != NULL);    LTC_ARGCHK(ct != NULL);    LTC_ARGCHK(skey != NULL);    Nr = skey->rijndael.Nr;    rk = skey->rijndael.eK;    /*     * map byte array block to cipher state     * and add initial round key:     */    LOAD32H(s0, pt      ); s0 ^= rk[0];    LOAD32H(s1, pt  +  4); s1 ^= rk[1];    LOAD32H(s2, pt  +  8); s2 ^= rk[2];    LOAD32H(s3, pt  + 12); s3 ^= rk[3];    for (r = 0; ; r++) {        rk += 4;        t0 =            Te0(byte(s0, 3)) ^            Te1(byte(s1, 2)) ^            Te2(byte(s2, 1)) ^            Te3(byte(s3, 0)) ^            rk[0];        t1 =            Te0(byte(s1, 3)) ^            Te1(byte(s2, 2)) ^            Te2(byte(s3, 1)) ^            Te3(byte(s0, 0)) ^            rk[1];        t2 =            Te0(byte(s2, 3)) ^            Te1(byte(s3, 2)) ^            Te2(byte(s0, 1)) ^            Te3(byte(s1, 0)) ^            rk[2];        t3 =            Te0(byte(s3, 3)) ^            Te1(byte(s0, 2)) ^            Te2(byte(s1, 1)) ^            Te3(byte(s2, 0)) ^            rk[3];        if (r == Nr-2) {            break;        }        s0 = t0; s1 = t1; s2 = t2; s3 = t3;    }    rk += 4;    /*     * apply last round and     * map cipher state to byte array block:     */    s0 =        (Te4_3[byte(t0, 3)]) ^        (Te4_2[byte(t1, 2)]) ^        (Te4_1[byte(t2, 1)]) ^        (Te4_0[byte(t3, 0)]) ^        rk[0];    STORE32H(s0, ct);    s1 =        (Te4_3[byte(t1, 3)]) ^        (Te4_2[byte(t2, 2)]) ^        (Te4_1[byte(t3, 1)]) ^        (Te4_0[byte(t0, 0)]) ^        rk[1];    STORE32H(s1, ct+4);    s2 =        (Te4_3[byte(t2, 3)]) ^        (Te4_2[byte(t3, 2)]) ^        (Te4_1[byte(t0, 1)]) ^        (Te4_0[byte(t1, 0)]) ^        rk[2];    STORE32H(s2, ct+8);    s3 =        (Te4_3[byte(t3, 3)]) ^        (Te4_2[byte(t0, 2)]) ^        (Te4_1[byte(t1, 1)]) ^        (Te4_0[byte(t2, 0)]) ^         rk[3];    STORE32H(s3, ct+12);    return CRYPT_OK;}int ECB_DEC(const unsigned char *ct, unsigned char *pt, symmetric_key *skey){    ulong32 s0, s1, s2, s3, t0, t1, t2, t3, *rk;    int Nr, r;    LTC_ARGCHK(pt != NULL);    LTC_ARGCHK(ct != NULL);    LTC_ARGCHK(skey != NULL);        Nr = skey->rijndael.Nr;    rk = skey->rijndael.dK;    /*     * map byte array block to cipher state     * and add initial round key:     */    LOAD32H(s0, ct      ); s0 ^= rk[0];    LOAD32H(s1, ct  +  4); s1 ^= rk[1];    LOAD32H(s2, ct  +  8); s2 ^= rk[2];    LOAD32H(s3, ct  + 12); s3 ^= rk[3];    for (r = 0; ; r++) {        rk += 4;        t0 =            Td0(byte(s0, 3)) ^            Td1(byte(s3, 2)) ^            Td2(byte(s2, 1)) ^            Td3(byte(s1, 0)) ^            rk[0];        t1 =            Td0(byte(s1, 3)) ^            Td1(byte(s0, 2)) ^            Td2(byte(s3, 1)) ^            Td3(byte(s2, 0)) ^            rk[1];        t2 =            Td0(byte(s2, 3)) ^            Td1(byte(s1, 2)) ^            Td2(byte(s0, 1)) ^            Td3(byte(s3, 0)) ^            rk[2];        t3 =            Td0(byte(s3, 3)) ^            Td1(byte(s2, 2)) ^            Td2(byte(s1, 1)) ^            Td3(byte(s0, 0)) ^            rk[3];        if (r == Nr-2) {           break;         }        s0 = t0; s1 = t1; s2 = t2; s3 = t3;    }    rk += 4;    /*     * apply last round and     * map cipher state to byte array block:     */    s0 =        (Td4[byte(t0, 3)] & 0xff000000) ^        (Td4[byte(t3, 2)] & 0x00ff0000) ^        (Td4[byte(t2, 1)] & 0x0000ff00) ^        (Td4[byte(t1, 0)] & 0x000000ff) ^        rk[0];    STORE32H(s0, pt);    s1 =        (Td4[byte(t1, 3)] & 0xff000000) ^        (Td4[byte(t0, 2)] & 0x00ff0000) ^        (Td4[byte(t3, 1)] & 0x0000ff00) ^        (Td4[byte(t2, 0)] & 0x000000ff) ^        rk[1];    STORE32H(s1, pt+4);    s2 =        (Td4[byte(t2, 3)] & 0xff000000) ^        (Td4[byte(t1, 2)] & 0x00ff0000) ^        (Td4[byte(t0, 1)] & 0x0000ff00) ^        (Td4[byte(t3, 0)] & 0x000000ff) ^        rk[2];    STORE32H(s2, pt+8);    s3 =        (Td4[byte(t3, 3)] & 0xff000000) ^        (Td4[byte(t2, 2)] & 0x00ff0000) ^        (Td4[byte(t1, 1)] & 0x0000ff00) ^        (Td4[byte(t0, 0)] & 0x000000ff) ^        rk[3];    STORE32H(s3, pt+12);    return CRYPT_OK;}/**  CBC encrypt  @param pt     Plaintext  @param ct     [out] Ciphertext  @param len    The number of bytes to process (must be multiple of block length)  @param cbc    CBC state  @return CRYPT_OK if successful*/int aes_cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc){   int x, err;   LTC_ARGCHK(pt != NULL);   LTC_ARGCHK(ct != NULL);   LTC_ARGCHK(cbc != NULL);   /* is blocklen valid? */   if (cbc->blocklen < 1 || cbc->blocklen > (int)sizeof(cbc->IV)) {      return CRYPT_INVALID_ARG;   }       if (len % cbc->blocklen) {      return CRYPT_INVALID_ARG;   }    while (len) {         /* xor IV against plaintext */         for (x = 0; x < cbc->blocklen; x++) {              cbc->IV[x] ^= pt[x];         }         /* encrypt */         if ((err = ECB_ENC(cbc->IV, ct, &cbc->key)) != CRYPT_OK) {            return err;         }         for (x = 0; x < cbc->blocklen; x++) {                cbc->IV[x] = ct[x];          }                ct  += cbc->blocklen;        pt  += cbc->blocklen;        len -= cbc->blocklen;   }   return CRYPT_OK;}/**  CBC decrypt  @param ct     Ciphertext  @param pt     [out] Plaintext  @param len    The number of bytes to process (must be multiple of block length)  @param cbc    CBC state  @return CRYPT_OK if successful*/int aes_cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc){   int x, err;   unsigned char tmp[16];   unsigned char tmpy;   LTC_ARGCHK(pt  != NULL);   LTC_ARGCHK(ct  != NULL);   LTC_ARGCHK(cbc != NULL);      /* is blocklen valid? */   if (cbc->blocklen < 1 || cbc->blocklen > (int)sizeof(cbc->IV)) {      return CRYPT_INVALID_ARG;   }       if (len % cbc->blocklen) {      return CRYPT_INVALID_ARG;   }       while (len) {         /* decrypt */         if ((err = ECB_DEC(ct, tmp, &cbc->key)) != CRYPT_OK) {            return err;         }         for (x = 0; x < cbc->blocklen; x++) {               tmpy       = tmp[x] ^ cbc->IV[x];               cbc->IV[x] = ct[x];               pt[x]      = tmpy;         }                ct  += cbc->blocklen;         pt  += cbc->blocklen;         len -= cbc->blocklen;   }   return CRYPT_OK;}voidfz_aesinit(fz_aes *aes, unsigned char *key, unsigned keylen){	int res;	aes->ivinited = 0;	aes->cbckey.blocklen = 16;	res = SETUP(key, keylen, 0, &aes->cbckey.key);	assert(CRYPT_OK == res);}void fz_setiv(fz_aes *aes, unsigned char *iv){	memmove(aes->cbckey.IV, iv, 16);	aes->ivinited = 1;}voidfz_aesdecrypt(fz_aes *aes, unsigned char *dest, unsigned char *src, unsigned len){	assert(aes->ivinited);	if (len > 0)		aes_cbc_decrypt(src, dest, len, &aes->cbckey);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?