📄 aes.cpp
字号:
/* borZoi - An Elliptic Curve Cryptography Library Copyright (C) 2001 Anthony Mulcahy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. \You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include "borzoi.h"extern "C" {#include "rijndael-alg-fst.h"}OCTETSTR Enc (OCTETSTR U, OCTETSTR KB);OCTETSTR Dec (OCTETSTR U, OCTETSTR KB);// AES_CBC_IV0OCTETSTR Enc (OCTETSTR U, OCTETSTR KB, int Nr, int keysize) { int j; OCTET Key[32]; for (j=0; j<32; j++) { Key[j] = KB[j]; } unsigned int KeySchedule[4*(14+1)]; OCTET u[16]; //rijndaelKeySetupEnc (KeySchedule, Key, 128); rijndaelKeySetupEnc (KeySchedule, Key, keysize);
for (j=0; j<16; j++) { u[j] = U[j]; } OCTET c[16]; rijndaelEncrypt (KeySchedule, Nr, u, c); OCTETSTR C (16); for (j=0; j<16; j++) { C[j]=c[j]; } return C;}OCTETSTR Dec (OCTETSTR KB, OCTETSTR U, int Nr, int keysize) { int j; OCTET Key[32]; for (j=0; j<32; j++) { Key[j] = KB[j]; } unsigned int KeySchedule[4*(14+1)]; OCTET u[16]; //rijndaelKeySetupDec (KeySchedule, Key, 128); rijndaelKeySetupDec (KeySchedule, Key, keysize);
for (j=0; j<16; j++) { u[j] = U[j]; } OCTET p[16]; rijndaelDecrypt (KeySchedule, Nr, u, p); OCTETSTR P (16); for (j=0; j<16; j++) { P[j]=p[j]; } return P;}OCTETSTR AES_CBC_IV0_Encrypt (OCTETSTR KB, OCTETSTR M, int keysize) { int Nr; switch (keysize) { case 256: Nr = 14; break; case 192: Nr = 12; break; default: Nr = 10; } OCTETSTR::size_type mLen = M.size(); OCTET padLen = 16 - (mLen%16); long k = ((mLen+1)/16); if ((mLen+1)%16) k++; OCTETSTR P1(1); P1[0] = padLen; OCTETSTR P2(padLen); for (OCTET l=0; l<padLen; l++) { P2[l] = P1[0]; } OCTETSTR T = M || P2; OCTETSTR C (16); OCTETSTR U (16); for (long i=1; i<=k; i++) { for (int j=0; j<16; j++) { if (i==1) U[j] = T[(i-1)*16+j]; else U[j] = T[(i-1)*16+j] ^ C[(i-2)*16+j]; } if (i==1) C = Enc (U, KB, Nr, keysize); else C = C || Enc (U, KB, Nr, keysize); } return C;}// Returns the decrypted plain text or else throws borzoiExceptionOCTETSTR AES_CBC_IV0_Decrypt (OCTETSTR KB, OCTETSTR C, int keysize) { int Nr; switch (keysize) { case 256: Nr = 14; break; case 192: Nr = 12; break; default: Nr = 10; } OCTETSTR M; OCTETSTR::size_type cLen = C.size(); if (cLen%16) { throw borzoiException ("AES_CBC_IV0_Decrypt: cLen not a multiple of 16"); return M; } if (cLen<16) { throw borzoiException ("AES_CBC_IV0_Decrypt: cLen < 16"); return M; } long k = ((cLen+1)/16); OCTETSTR T(cLen); OCTETSTR U (16); OCTETSTR CI (16); for (long i=1; i<=k; i++) { for (long n=0; n<16; n++) { CI[n] = C[(i-1)*16+n]; } U = Dec (KB, CI, Nr, keysize); for (int j=0; j<16; j++) { if (i>1) T[(i-1)*16+j] = U[j] ^ C[(i-2)*16+j]; else T[j] = U[j]; } } OCTET padLen = T[(k*16)-1]; if (padLen<1) { throw borzoiException ("AES_CBC_IV0_Decrypt: padLen < 1"); return M; } if (padLen>16) { throw borzoiException ("AES_CBC_IV0_Decrypt: padLen > 16"); return M; } for (OCTET l=1; l<padLen; l++) { if (T[(k*16)-1-l] != padLen) { throw borzoiException ("AES_CBC_IV0_Decrypt: OCTET != padLen"); return M; } } M = OCTETSTR (T.begin(), T.end()-padLen); return M;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -