Talk About Network

Google





Science > Cryptography- Moderated > Cartcam block c...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 1 of 3 Topic 320 of 321
Post > Topic >>

Cartcam block cipher - C implementation

by darksoftware@[EMAIL PROTECTED] Oct 20, 2008 at 08:14 AM

This is new cipher source code - maybe someone needs it.
It's very interesting, how to make it more secure, what number of
rounds is optimal.





/*      Cartman.C by Alexander Myasnikov
**/
/*      Cartman Tiny block cipher for Delphi programmers          **/
/*      Cartman encrypts 128 bit block with 512 bit key            **/
/*      WEB:       www.darksoftware.narod.ru
**/


#include <string.h>
#include <stdlib.h>


#define u32 unsigned long

#define ROR32(x, n)  _lrotr(x,n)
#define ROL32(x, n)  _lrotl(x,n)

u32 key[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


void __stdcall __ex****t crypt (u32 *v)
{
u32 ki, k1, k2, k3, k4, mod1, mod2;
long i;


  for (i=0; i<=127;i++)
{

      ki = i%8;
      k1 = key [ki*2];
      k2 = key [ki*2+1];
      k3 = key [15-ki*2];
      k4 = key [15-ki*2+1];
      mod1 = k1%32;
      mod2 = k2%32;

      v[0]^=  (v[1]+v[2]) % k1;
      v[1]^=  (v[2]+v[3]) % k2;
      v[2]^=  (v[3]+v[0]) % k1;
      v[3]^=  (v[0]+v[2]) % k2;

      v[0]+=  ROR32 (v[1] + k1, mod2);
      v[0]-=  ROL32 (v[2] + k2, mod1);
      v[0]+=  ROR32 (v[3] + k1, mod2);
      v[1]-=  ROL32 (v[0] + k2, mod1);
      v[1]+=  ROR32 (v[2] + k1, mod2);
      v[1]-=  ROL32 (v[3] + k2, mod1);
      v[2]+=  ROR32 (v[0] + k1, mod2);
      v[2]-=  ROL32 (v[1] + k2, mod1);
      v[2]+=  ROR32 (v[3] + k1, mod2);
      v[3]-=  ROL32 (v[0] + k2, mod1);
      v[3]+=  ROR32 (v[1] + k1, mod2);
      v[3]-=  ROL32 (v[2] + k2, mod1);

      v[0]+= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k4 ));
      v[0]-= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k3 ));
      v[0]+= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k4 ));
      v[1]-= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k3 ));
      v[1]+= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k4 ));
      v[1]-= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k3 ));
      v[2]+= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k4 ));
      v[2]-= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k3 ));
      v[2]+= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k4 ));
      v[3]-= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k3 ));
      v[3]+= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k4 ));
      v[3]-= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k3 ));


}


}


void __stdcall __ex****t  decrypt (u32 *v)
{

u32  ki, k1, k2, k3, k4, mod1, mod2;
long i;


  for (i=127; i>=0;i--)
{

      ki = i%8;
      k1 = key [ki*2];
      k2 = key [ki*2+1];
      k3 = key [15-ki*2];
      k4 = key [15-ki*2+1];
      mod1 = k1%32;
      mod2 = k2%32;


      v[3]+= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k3 ));
      v[3]-= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k4 ));
      v[3]+= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k3 ));
      v[2]-= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k4 ));
      v[2]+= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k3 ));
      v[2]-= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k4 ));
      v[1]+= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k3 ));
      v[1]-= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k4 ));
      v[1]+= ((v[0] << 6) ^ (v[0] >> 9 ) + (v[0] ^ k3 ));
      v[0]-= ((v[3] << 6) ^ (v[3] >> 9 ) + (v[3] ^ k4 ));
      v[0]+= ((v[2] << 6) ^ (v[2] >> 9 ) + (v[2] ^ k3 ));
      v[0]-= ((v[1] << 6) ^ (v[1] >> 9 ) + (v[1] ^ k4 ));


      v[3]+=  ROL32 (v[2] + k2, mod1);
      v[3]-=  ROR32 (v[1] + k1, mod2);
      v[3]+=  ROL32 (v[0] + k2, mod1);
      v[2]-=  ROR32 (v[3] + k1, mod2);
      v[2]+=  ROL32 (v[1] + k2, mod1);
      v[2]-=  ROR32 (v[0] + k1, mod2);
      v[1]+=  ROL32 (v[3] + k2, mod1);
      v[1]-=  ROR32 (v[2] + k1, mod2);
      v[1]+=  ROL32 (v[0] + k2, mod1);
      v[0]-=  ROR32 (v[3] + k1, mod2);
      v[0]+=  ROL32 (v[2] + k2, mod1);
      v[0]-=  ROR32 (v[1] + k1, mod2);

      v[3]^=  (v[0]+v[2]) % k2;
      v[2]^=  (v[3]+v[0]) % k1;
      v[1]^=  (v[2]+v[3]) % k2;
      v[0]^=  (v[1]+v[2]) % k1;


}

}




void __stdcall __ex****t setup (u32 *data)
{
 memmove(&key[0],&data[0], 64);
}


void __stdcall __ex****t cartman_killkey()
{
  memset(key, 0, 64);
  memset(key, 0, 0xFF);
}
 




 3 Posts in Topic:
Cartcam block cipher - C implementation
darksoftware@[EMAIL PROTE  2008-10-20 08:14:06 
Re: Cartcam block cipher - C implementation
Oleg Khovayko <"[  2008-10-22 10:50:19 
Re: Cartcam block cipher - C implementation
Ertugrul =?UTF-8?B?U8O2eW  2008-10-24 05:34:46 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
localhost-V2008-12-19 Wed Jan 7 23:57:09 PST 2009.