我加密后,解密出来的不是原文。
- C/C++ code
void CRC5Base::InitialKeyAndRounds(unsigned char *key, int iKeyLength, int iRounds) { m_rc5Key.iKeyLong = iKeyLength; this->iRounds = iRounds; int T = 2 * iRounds + 2; int i , j, c, t; c = iKeyLength / 4; RC5_WORD *S = new RC5_WORD[T]; S[0] = P32; for (i = 1; i < T; i++) { S[i] = S[i-1] + Q32; } m_rc5Key.KeyExpanded = S; RC5_WORD *L = new RC5_WORD[c]; for (i = 0;i< c; i++) { L[i] = 0; } for (i = 0; i < iKeyLength; i++) { t = (key[i] & 0xFF) << (8 * (i % 4)); L[i/4] = L[i/4] + t; } i = 0; j = 0; RC5_WORD X = 0; RC5_WORD Y = 0; int k = (T > c) ? 3 * T : 3 * c; while ( k --) { X = m_rc5Key.KeyExpanded[i] = ROTL(m_rc5Key.KeyExpanded[i] + X + Y, 3); i = (i + 1) % T; Y = L[j] = ROTL(L[j] + X + Y, X + Y); j = (j + 1) % c; } delete L; } RC5_WORD CRC5Base::ROTL(RC5_WORD s, RC5_WORD x) { RC5_WORD Temp = 0; Temp = (s << x ) | (s >> (32 - x )); return Temp; } RC5_WORD CRC5Base::ROTR(RC5_WORD s, RC5_WORD x) { RC5_WORD Temp = 0; Temp = (s >> x ) | (s << (32 - x)); return Temp; } void CRC5Base::Encrypt(unsigned char *data) { RC5_WORD *S = m_rc5Key.KeyExpanded; RC5_WORD A, B; A = data[0] & 0xFF; A += (data[1] & 0xFF) << 8; A += (data[2] & 0xFF) << 16; A += (data[3] & 0xFF) << 24; B = data[4] & 0xFF; B += (data[5] & 0xFF) << 8; B += (data[6] & 0xFF) << 16; B += (data[7] & 0xFF) << 24; A = A + S[0]; B = B + S[1]; for (int i = 1; i <= iRounds; i++) { A = ROTL(A ^ B, B) + S[2 * i]; B = ROTL(B ^ A, A) + S[2 * i + 1]; } data[0] = (A >> 0) & 0xFF; data[1] = (A >> 8) & 0xFF; data[2] = (A >> 16) & 0xFF; data[3] = (A >> 24) & 0xFF; data[4] = (B >> 0) & 0xFF; data[5] = (B >> 8) & 0xFF; data[6] = (B >> 16) & 0xFF; data[7] = (B >> 24) & 0xFF; } void CRC5Base::Decrypt(unsigned char *data) { RC5_WORD *S = m_rc5Key.KeyExpanded; RC5_WORD A, B; A = data[0] & 0xFF; A += (data[1] & 0xFF) << 8; A += (data[2] & 0xFF) << 16; A += (data[3] & 0xFF) << 24; B = data[4] & 0xFF; B += (data[5] & 0xFF) << 8; B += (data[6] & 0xFF) << 16; B += (data[7] & 0xFF) << 24; for (int i = iRounds; i > 0; i--) { B = (ROTR(B - S[2 * iRounds + 1], A)) ^ A; A = (ROTR(A - S[2 * iRounds], B)) ^ B; } B = B - S[1]; A = A - S[0]; data[0] = (A >> 0) & 0xFF; data[1] = (A >> 8) & 0xFF; data[2] = (A >> 16) & 0xFF; data[3] = (A >> 24) & 0xFF; data[4] = (B >> 0) & 0xFF; data[5] = (B >> 8) & 0xFF; data[6] = (B >> 16) & 0xFF; data[7] = (B >> 24) & 0xFF; }
------解决方案--------------------
void CRC5Base::Decrypt(unsigned char *data)
中的
- C/C++ code
for (int i = iRounds; i > 0; i--) { B = (ROTR(B - S[2 * iRounds + 1], A)) ^ A; A = (ROTR(A - S[2 * iRounds], B)) ^ B; }