public byte [] Decrypt(byte [] cipher) { //int iters = cipher.Length / 8; int blockSize = 8; int rem = cipher.Length % blockSize; if(rem != 0) throw new Exception("must be in 8 byte blocks"); byte [] lastBlock = new byte[blockSize]; Array.Copy(cipher, cipher.Length - blockSize, lastBlock, 0, blockSize); TripleDESCryptoServiceProvider tempTdcsp = new TripleDESCryptoServiceProvider(); tempTdcsp.Key = (byte[]) _tdcsp.Key.Clone(); tempTdcsp.IV = lastBlock; //TODO make this support other lengths 0x01 - 0x07070707070707 byte [] pkcs5 = new byte [] {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08}; byte [] padPlus = tempTdcsp.EncryptValue(pkcs5); byte [] paddedCipher = new byte [cipher.Length + blockSize]; Array.Copy(cipher, 0, paddedCipher, 0, cipher.Length); Array.Copy(padPlus, 0, paddedCipher, cipher.Length, blockSize); byte [] plain = _tdcsp.DecryptValue(paddedCipher); return plain; }
public TripleDesKeyWrap(TripleDESCryptoServiceProvider tdcsp) { _tdcsp = tdcsp; }
public TripleDesNoPadding(TripleDESCryptoServiceProvider tdcsp) { _tdcsp = tdcsp; }