[prev in list] [next in list] [prev in thread] [next in thread] 

List:       best-of-security
Subject:    BoS: diffie-helman in 93 lines
From:       Julian Assange <proff () suburbia ! net>
Date:       1995-09-17 11:27:16
[Download RAW message or body]

/* Export-a-crypto-system-sig-II: Diffie-Hellman in 10 lines of C */
#include <stdio.h>		/* Usage: dh base exponent modulus */
typedef unsigned char u;
u m[1024], g[1024], e[1024], b[1024];
int n, v, d, z, S = 129;
a (
    u * x, u * y, int o)
{
  d = 0;
  for (v = S; v--;)
    {
      d += x[v] + y[v] * o;
      x[v] = d;
      d = d >> 8;
    }
}
s (u * x)
{
  for (
	v = 0; (v < S - 1) && (x[v] == m[v]);)
    v++;
  if (x[v] >= m[v])
    a (x, m, -1);
}
r (u * x)
{
  d = 0;
  for (v = 0; v <
       S;)
    {
      d |= x[v];
      x[v++] = d / 2;
      d = (d & 1) << 8;
    }
}
M (u * x, u * y)
{
  u X[1024], Y[1024];
  bcopy (x, X, S
    );
  bcopy (y, Y, S);
  bzero (x, S);
  for (z = S * 8; z--;)
    {
      if (X[S - 1] & 1)
	{
	  a (x, Y, 1);
	  s (x);
	}
      r (X);
      a (Y
	 ,Y, 1);
      s (Y);
    }
}
h (char *x, u * y)
{
  bzero (y, S);
  for (n = 0; x[n] > 0; n++)
    {
      for (z = 4; z--;)
	a (y, y
	   ,1);
      x[n] |= 32;
      y[S - 1] |= x[n] - 48 - (x[n] > 96) * 39;
    }
}
p (u * x)
{
  for (n = 0; !x[n];)
    n++;
  for (; n <
       S; n++)
    printf ("%c%c", 48 + x[n] / 16 + (x[n] > 159) * 7, 48 + (x[n] & 15) + 7 * ((x[n] & 15) > 9));
  printf ("\n");
}
main (int c, char **v)
{
  h (v[1], g);
  h (v[2], e);
  h (v[3], m);
  bzero (b, S);
  b[
     S - 1] = 1;
  for (n = S * 8; n--;)
    {
      if (e[S - 1] & 1)
	M (b, g);
      M (g, g);
      r (e);
    }
  p (b);
}

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic