int main(int argc, char* argv[]) { aes_context_t aes_ctx; aes_init(&aes_ctx); aes_set_key(&aes_ctx, s_key); //aes_encrypt(&aes_ctx, s_in, s_enc); //aes_decrypt(&aes_ctx, s_enc, s_dec); aes_encrypt_ctr(&aes_ctx, s_in, s_enc, sizeof(s_in), s_iv); aes_decrypt_ctr(&aes_ctx, s_enc, s_dec, sizeof(s_in), s_iv); return 0; }
bool QAesWrap::encrypt(const QByteArray & in, QByteArray & out, AesMode mode,PaddingMode pad) const { if (in.isEmpty()) return false; out.clear(); switch (mode) { case AES_CTR: out.resize(in.size()); aes_encrypt_ctr((unsigned char *)in.data(),in.size(),(unsigned char *)out.data(),mpass,mbit,msalt); break; case AES_ECB: case AES_CBC: initPadding(in,out,mode,pad); break; default: return false; } return true; }
bool QAesWrap::decrypt(const QByteArray & in, QByteArray & out, AesMode mode,PaddingMode pad) const { if (in.isEmpty()) return false; out.clear(); int size = in.size(); out.resize(size); if (mode == AES_CTR) { aes_encrypt_ctr((unsigned char *)in.data(),size,(unsigned char *)out.data(),mpass,mbit,msalt); return true; } int last = size % AES_BLOCK_SIZE; int blocks = size / AES_BLOCK_SIZE; int useSize = blocks * AES_BLOCK_SIZE; if (blocks == 0 ) { out = in; return false; } QByteArray tdata; if (last > 0) { if(pad == ANSIX923 || pad == PKCS7) { out.clear(); return false; } tdata = in.right(last); } switch (mode) { case AES_ECB: ecbdecrypt((unsigned char *)in.data(),useSize,out); break; case AES_CBC: aes_decrypt_cbc((unsigned char *)in.data(),useSize,(unsigned char *)out.data(),mpass,mbit,msalt); break; default: return false; } if (last > 0) { for (int i = useSize, j = 0; i < size; ++i,++j) { out[i] = tdata.at(j); } } else { char ch = out.at(size-1); if (ch < 16) { //验证是否需要移除。 int removed = 0; int tsize = size - ch; bool isPad = true; if (pad == ANSIX923) { int mysize = size - 1; char tch; for (int i = tsize; i < mysize; ++i) { tch = out.at(i); if (tch != char(0x00)) { isPad = false; } } if (isPad) removed = ch; } else { char tch; for (int i = tsize; i < size; ++i) { tch = out.at(i); if (tch != ch) { isPad = false; } } if (isPad) removed = ch; } if (removed > 0) { out.remove(size - removed,removed); } } } return true; }