⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa_1.txt

📁 rsa加密算法源程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
X*******************************************************************************/
X
X#include	<stdio.h>
X
X#include	"arith.h"
X#include	"prim.h"
X#include	"nio.h"
X#include	"rnd.h"
X
Xchar *prog;
X
XNUMBER a_three,a_four;
X
Xusage()
X{
X	fprintf(stderr,"usage: %s digits [probability]\n",prog);
X	exit (1);
X}
X
Xmain( argc, argv )
Xchar **argv;
X{
X	NUMBER prim;
X	int len,i,prob;
X	
X	prog = argv[0];	
X	
X	if ( argc < 2 || 3 < argc )
X		usage();
X	
X	len = atoi( argv[1] );
X	if (argc > 2)
X		prob = atoi( argv[2] );
X	else
X		prob = 10;
X
X	a_add( &a_one, &a_two, &a_three );
X	a_add( &a_two, &a_two, &a_four );
X
X	init_rnd();
X	
X	do {
X		gen_number( len, &prim );
X	} while ( !prim.n_len );
X	
X	a_mult( &prim, &a_two, &prim );
X	a_mult( &prim, &a_three, &prim );
X	a_add( &prim, &a_one, &prim );
X	
X	for (i=1 ;; i++) {
X		if (p_prim( &prim, prob ))
X			break;
X		if (i % 2)
X			a_add( &prim, &a_four, &prim );
X		else
X			a_add( &prim, &a_two, &prim );
X	}
X	fprintf(stderr,"%d cycles\n",i);
X	
X	num_fput( &prim, stdout );
X}
SHAR_EOF
if test 1416 -ne "`wc -c < 'genprim.c'`"
then
	echo shar: "error transmitting 'genprim.c'" '(should have been 1416 characters)'
fi
fi
echo shar: "extracting 'genrsa.c'" '(1458 characters)'
if test -f 'genrsa.c'
then
	echo shar: "will not over-write existing file 'genrsa.c'"
else
sed 's/^X//' << \SHAR_EOF > 'genrsa.c'
X/*******************************************************************************
X*									       *
X*	Copyright (c) Martin Nicolay,  22. Nov. 1988			       *
X*									       *
X*	Wenn diese (oder sinngemaess uebersetzte) Copyright-Angabe enthalten   *
X*	bleibt, darf diese Source fuer jeden nichtkomerziellen Zweck weiter    *
X*	verwendet werden.						       *
X*									       *
X*	martin@trillian.megalon.de					       *
X*									       *
X*******************************************************************************/
X
X#include	<stdio.h>
X
X#include	"arith.h"
X#include	"nio.h"
X#include	"prim.h"
X#include	"rnd.h"
X
Xmain()
X{
X	NUMBER p1,p2,n,d,e,phi,*max_p;
X	int len;
X	
X	num_fget( &p1, stdin ); getchar();
X	num_fget( &p2, stdin );
X	
X	if ( !a_cmp( &p1, &p2 ) ) {
X		fprintf(stderr,"the prime numbers must not be identical!\n");
X		exit(1);
X	}
X	
X	if (a_cmp( &p1, &p2 ) > 0)
X		max_p = &p1;
X	else
X		max_p = &p2;
X
X	a_mult( &p1, &p2, &n );
X	num_fput( &n, stdout ); puts("#"); fflush(stdout);
X	
X	a_sub( &p1, &a_one, &phi );
X	a_sub( &p2, &a_one, &e );
X	a_mult( &phi, &e, &phi );
X	
X	len = n_bitlen( &phi );
X	len = ( len + 3 ) / 4;
X	
X	a_assign( &p1, &phi );
X	a_sub( &p1, &a_one, &p1 );
X	init_rnd();
X	do {
X		do {
X			gen_number( len, &d );
X		} while (a_cmp( &d, max_p ) <= 0 || a_cmp( &d, &p1 ) >= 0);
X				
X		a_ggt( &d, &phi, &e );
X	} while ( a_cmp( &e, &a_one ) );
X	
X	num_fput( &d, stdout ); puts("#"); fflush(stdout);
X	
X	inv( &d, &phi, &e );
X	
X	num_fput( &e, stdout );
X}
X
SHAR_EOF
if test 1458 -ne "`wc -c < 'genrsa.c'`"
then
	echo shar: "error transmitting 'genrsa.c'" '(should have been 1458 characters)'
fi
fi
echo shar: "extracting 'nio.c'" '(4300 characters)'
if test -f 'nio.c'
then
	echo shar: "will not over-write existing file 'nio.c'"
else
sed 's/^X//' << \SHAR_EOF > 'nio.c'
X/*******************************************************************************
X*									       *
X*	Copyright (c) Martin Nicolay,  22. Nov. 1988			       *
X*									       *
X*	Wenn diese (oder sinngemaess uebersetzte) Copyright-Angabe enthalten   *
X*	bleibt, darf diese Source fuer jeden nichtkomerziellen Zweck weiter    *
X*	verwendet werden.						       *
X*									       *
X*	martin@trillian.megalon.de					       *
X*									       *
X*******************************************************************************/
X
X#include	<stdio.h>
X#include	<ctype.h>
X#include	<string.h>
X
X#include	"nio.h"
X
X/*
X *	NUMBER io
X */
X
X/*
X *		Funktionen
X *
X * int	num_sput( n, s, l)
X *		NUMBER *n;
X *		char s[l];
X *			schreibt *n als Hex-Zahl in s
X *
X * int	num_fput( n, f )
X *		NUMBER *n;
X *		FILE *f;
X *			schreibt *n als Hex-Zahl in File f
X *
X * int	num_sget( n, s )
X *		NUMBER *n;
X *		char *s;
X *			liest Hex-Zahl s in *n ein
X *
X * int	num_fget( n, f )
X *		NUMBER *n;
X *		FILE *f;
X *			liest eine Hex-Zahl von f in *n ein
X *
X */
X
X
Xstatic char *HEX="0123456789ABCDEF";
Xstatic char *hex="0123456789abcdef";
X
Xstatic NUMBER bits[9];
Xstatic NUMBER int16[16];
X
Xstatic int init = 0;
X
Xstatic num_init()
X{
X	int i;
X	
X	a_assign( &bits[0], &a_one );
X	for ( i=1; i<9; i++)
X		a_add( &bits[i-1], &bits[i-1], &bits[i] );
X
X	a_assign( &int16[0], &a_one );
X	for ( i=1; i<16; i++)
X		a_add( &int16[i-1], &a_one, &int16[i] );
X	
X	init = 1;
X}
X
X
Xint num_sput( n, s, l)
XNUMBER *n;
Xchar *s;
X{
X#if MAXINT == ( (1 << MAXBIT) - 1 )
X	INT *p;
X	int bi,ab,i;
X	long b;
X	int first = 1;
X	
X	bi = MAXBIT * n->n_len;
X	ab = 4 - (bi + 3) % 4 -1;
X	p  = &n->n_part[n->n_len -1];
X
X	if ( (bi+3) / 4 >= l )
X		return(EOF);
X	
X	b  = 0;
X	while (bi) {
X		b <<= (MAXBIT);
X		b |= (unsigned long)*p--;
X		bi -= MAXBIT;
X		ab += MAXBIT;
X		while (ab >= 4) {
X			i = (b >> (ab - 4));
X			b &= ( 1L << (ab - 4) ) -1L;
X			ab -= 4;
X
X			if (first && !i)
X				continue;
X			first = 0;
X			*s++ = HEX[ i ];
X		}
X	}
X	if (b)
X		abort();
X	*s = '\0';
X
X	return (0);
X#else			
X	NUMBER r,q;
X	int i,b,p,len,low,high;
X	char *np;
X	
X	if (! init)
X		num_init();
X	
X	a_assign( &q, n);
X	len = l;
X	np = s + l;
X
X	for (; q.n_len && len > 1; len --) {
X		a_div( &q, &bits[4], &q, &r );
X		for (p=8, b=0, i=3; i >= 0; i--, p /= 2 ) {
X			if ( a_cmp( &r, &bits[i] ) >= 0 ) {
X				a_sub( &r, &bits[i], &r );
X				b += p;
X			}
X		}
X		*--np = HEX[ b ];
X	}
X	if (q.n_len)
X		return(EOF);
X
X	l -= len;
X	len = l;
X	for (; l--; )
X		*s++ = *np++;
X	
X	*s = '\0';
X
X	return (0);
X#endif
X}
X
X
Xint num_fput( n, f )
XNUMBER *n;
XFILE *f;
X{
X	int j;
X	char *np;
X	unsigned char n_print[ STRLEN + 1 ];
X	
X	if ( num_sput( n, n_print, sizeof( n_print ) ) == EOF )
X		return(EOF);
X	
X	for (j=0, np=n_print; *np ; np++, j++ ) {
X		if (j==64) {
X			fputs("\n",f);
X			j = 0;
X		}
X		putc((int)*np,f);
X	}
X
X	if (j)
X		putc('\n',f);
X
X	return(0);
X}
X
X
Xint num_sget( n, s )
XNUMBER *n;
Xchar *s;
X{
X#if MAXINT == ( (1 << MAXBIT) - 1 )
X	INT *p;
X	char *hp;
X	int bi,ab,i;
X	long b;
X	int first = 1;
X	
X	bi = 4 * strlen(s);
X	ab = MAXBIT - (bi + MAXBIT -1) % MAXBIT -1;
X	i  =  (bi + MAXBIT-1) / MAXBIT;
X	p  = &n->n_part[ i -1 ];
X	n->n_len = i;
X
X	if ( i > MAXLEN )
X		return(EOF);
X	
X	b  = 0;
X	while (bi > 0) {
X		if ( hp= strchr( HEX, *s ) )
X			i = hp - HEX;
X		else if ( hp= strchr( hex, *s ) )
X			i = hp - hex;
X		else
X			return(EOF);
X		s++;
X		
X		b <<= 4;
X		b |= (unsigned long)i;
X		bi -= 4;
X		ab += 4;
X		while (ab >= MAXBIT) {
X			i = (b >> (ab - MAXBIT));
X			b &= ( 1L << (ab - MAXBIT) ) -1L;
X			ab -= MAXBIT;
X			if (first && !i) {
X				p--;
X				n->n_len--;
X			}
X			else {
X				first = 0;
X				*p-- = i;
X			}
X		}
X	}
X	if (b)
X		abort();
X	*s = '\0';
X
X	return (0);
X#else			
X	char *p;
X	int i,c;
X
X	if (! init)
X		num_init();
X	
X	n->n_len = 0;
X	while ( (c = *s++ & 0xFF) ) {
X		if ( p= strchr( HEX, c ) )
X			i = p - HEX;
X		else if ( p= strchr( hex, c ) )
X			i = p - hex;
X		else
X			return(EOF);
X		
X		a_mult( n, &bits[4], n );
X		if (i)
X			a_add( n, &int16[i-1], n );
X	}
X	
X	return(0);
X#endif
X}
X
Xint num_fget( n, f )
XNUMBER *n;
XFILE *f;
X{
X	int j,c;
X	char *np;
X	char n_print[ STRLEN + 1 ];
X
X	np = n_print;
X	j = sizeof(n_print);
X	while ( (c=getc(f)) != EOF && ( isxdigit(c) || isspace(c) ) ) {
X		if (isspace(c))
X			continue;
X		if (! --j)
X			return(EOF);
X		*np++ = (char)c;
X	}
X	*np = '\0';
X
X	if (c != EOF)
X		ungetc(c,f);
X	
X	if ( num_sget( n, n_print ) == EOF )
X		return( EOF );
X	
X	return(0);
X}
X
SHAR_EOF
if test 4300 -ne "`wc -c < 'nio.c'`"
then
	echo shar: "error transmitting 'nio.c'" '(should have been 4300 characters)'
fi
fi
echo shar: "extracting 'nio.h'" '(780 characters)'
if test -f 'nio.h'
then
	echo shar: "will not over-write existing file 'nio.h'"
else
sed 's/^X//' << \SHAR_EOF > 'nio.h'
X/*******************************************************************************
X*									       *
X*	Copyright (c) Martin Nicolay,  22. Nov. 1988			       *
X*									       *
X*	Wenn diese (oder sinngemaess uebersetzte) Copyright-Angabe enthalten   *
X*	bleibt, darf diese Source fuer jeden nichtkomerziellen Zweck weiter    *
X*	verwendet werden.						       *
X*									       *
X*	martin@trillian.megalon.de					       *
X*									       *
X*******************************************************************************/
X
X#ifndef	_nio_h_
X#define	_nio_h_
X
X#ifndef _arith_h_
X#include	"arith.h"
X#endif
X
X/*
X * Prototypes
X */
X
Xint	num_sput	P(( NUMBER*, char*, int ));
Xint	num_fput	P(( NUMBER*, FILE* ));
Xint	num_sget	P(( NUMBER*, char* ));
Xint	num_fget	P(( NUMBER*, FILE* ));
X
X#endif
SHAR_EOF
if test 780 -ne "`wc -c < 'nio.h'`"
then
	echo shar: "error transmitting 'nio.h'" '(should have been 780 characters)'
fi
fi
echo shar: "extracting 'prim.c'" '(4771 characters)'
if test -f 'prim.c'
then
	echo shar: "will not over-write existing file 'prim.c'"
else
sed 's/^X//' << \SHAR_EOF > 'prim.c'
X/*******************************************************************************
X*									       *
X*	Copyright (c) Martin Nicolay,  22. Nov. 1988			       *
X*									       *
X*	Wenn diese (oder sinngemaess uebersetzte) Copyright-Angabe enthalten   *
X*	bleibt, darf diese Source fuer jeden nichtkomerziellen Zweck weiter    *
X*	verwendet werden.						       *
X*									       *
X*	martin@trillian.megalon.de					       *
X*									       *
X*******************************************************************************/
X
X#include	"prim.h"
X
X/*
X *		RSA
X *
X *	p,q prim
X *	p != q
X *	n = p*q
X *	phi = (p -1)*(q -1)
X *	e,d aus 0...n-1
X *	e*d == 1 mod phi
X *
X *	m aus 0...n-1 sei eine Nachricht
X *
X *	Verschluesseln:
X *		E(x) = x^e mod n		( n,e oeffendlich )
X *
X *	Entschluesseln:
X *		D(x) = x^d mod n		( d geheim )
X *
X *
X *	Sicherheit:
X *
X *		p,q sollten bei mind. 10^100 liegen.
X *		(d,phi) == 1, das gilt fuer alle Primzahlen > max(p,q).
X *		Allerdings sollte d moeglichst gross sein ( d < phi-1 )
X *		um direktes Suchen zu verhindern.
X */
X
X
X/*
X *		FUNKTIONEN um RSA Schluessel zu generieren.
X *
X * int	p_prim( n, m )
X *		NUMBER *n;
X *		int m;
X *			0 : n ist nicht prim
X *			1 : n ist mit Wahrscheinlichkeit (1-1/2^m) prim
X *		ACHTUNG !!!!
X *		p_prim benutzt m_init
X *
X *	inv( d, phi, e )
X *		NUMBER *d,*phi,*e;
X *			*e = *d^-1 (mod phi)
X *		ACHTUNG !!!!
X *		p_prim benutzt m_init
X */
X
X/*
X * Prototypes
X */
Xstatic int	jak_f( NUMBER* );	
Xstatic int	jak_g( NUMBER*, NUMBER* );	
Xstatic int	jakobi( NUMBER*, NUMBER* );
X
X/*
X * Hilfs-Funktion fuer jakobi

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -