172 lines
3.8 KiB
C
172 lines
3.8 KiB
C
|
/*
|
|||
|
* (C) Copyright 2012
|
|||
|
* wangflord@allwinnertech.com
|
|||
|
*
|
|||
|
*
|
|||
|
* This program is free software; you can redistribute it and/or
|
|||
|
* modify it under the terms of the GNU General Public License as
|
|||
|
* published by the Free Software Foundation; either version 2 of
|
|||
|
* the License, or (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,
|
|||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
|
* GNU General Public License for more details.
|
|||
|
*
|
|||
|
* You should have received a copy of the GNU General Public License
|
|||
|
* along with this program;
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
A. <EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
1. <EFBFBD><EFBFBD>Կ<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
1) <EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>*<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
2) <EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>صĴ<EFBFBD><EFBFBD><EFBFBD>E<EFBFBD><EFBFBD><EFBFBD><EFBFBD>E<M<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD><EFBFBD>㷨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>ʹD<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>1 MOD M<EFBFBD><EFBFBD>
|
|||
|
3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ(<EFBFBD><EFBFBD>Կ)<EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ(˽Կ)<EFBFBD><EFBFBD>
|
|||
|
2. <EFBFBD><EFBFBD><EFBFBD>ܵIJ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tn1<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>0x012A05<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ<EFBFBD><EFBFBD>tn<EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>tn1<EFBFBD><EFBFBD>4
|
|||
|
2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>tn1λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD>Ŀ飬ÿ<EFBFBD>鿴<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊbn<EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>ÿ<EFBFBD>鶼С<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD>
|
|||
|
3) <EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD>Ai<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bi<EFBFBD><EFBFBD>Ai^E MOD N<EFBFBD><EFBFBD><EFBFBD>㡣Bi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һ<EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>
|
|||
|
3. <EFBFBD><EFBFBD><EFBFBD>ܵIJ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
1) ͬ<EFBFBD><EFBFBD><EFBFBD>ܵĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>tnλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD>Ŀ飬ÿ<EFBFBD>鿴<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊbn<EFBFBD><EFBFBD>
|
|||
|
3) <EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD>Bi<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ci<EFBFBD><EFBFBD>Bi^D MOD N<EFBFBD><EFBFBD><EFBFBD>㡣Ci<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һ<EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
#include "signature.h"
|
|||
|
|
|||
|
void rsa_dump(void);
|
|||
|
|
|||
|
typedef struct public_key_pairs_t
|
|||
|
{
|
|||
|
unsigned public_key; // e
|
|||
|
unsigned divider; // n
|
|||
|
}
|
|||
|
public_key_pairs;
|
|||
|
|
|||
|
typedef struct private_key_pairs_t
|
|||
|
{
|
|||
|
unsigned private_key; // d
|
|||
|
unsigned divider; // n
|
|||
|
}
|
|||
|
private_key_pairs;
|
|||
|
|
|||
|
|
|||
|
#define P (127)
|
|||
|
#define Q (401)
|
|||
|
#define N ((P) * (Q))
|
|||
|
#define M ((P-1) * (Q-1))
|
|||
|
#define E (53)
|
|||
|
|
|||
|
public_key_pairs pblc_keys;
|
|||
|
private_key_pairs prvt_keys;
|
|||
|
|
|||
|
static unsigned probe_gcd(unsigned divdend, unsigned divder)
|
|||
|
{
|
|||
|
unsigned ret = divdend % divder;
|
|||
|
|
|||
|
while(ret)
|
|||
|
{
|
|||
|
divdend = divder;
|
|||
|
divder = ret;
|
|||
|
ret = divdend % divder;
|
|||
|
}
|
|||
|
|
|||
|
return divder;
|
|||
|
}
|
|||
|
|
|||
|
unsigned probe_high_level_power_mod(unsigned base_value, unsigned power, unsigned divider)
|
|||
|
{
|
|||
|
unsigned ret = 1;
|
|||
|
|
|||
|
base_value %= divider;
|
|||
|
while(power > 0)
|
|||
|
{
|
|||
|
if(power & 1)
|
|||
|
{
|
|||
|
ret = (ret * base_value) % divider;
|
|||
|
}
|
|||
|
power /= 2;
|
|||
|
base_value = (base_value * base_value) % divider;
|
|||
|
}
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
unsigned rsa_init(void)
|
|||
|
{
|
|||
|
unsigned k;
|
|||
|
unsigned product;
|
|||
|
unsigned m_value;
|
|||
|
|
|||
|
m_value = M;
|
|||
|
|
|||
|
k = 1;
|
|||
|
if(probe_gcd(m_value, E) == 1) //e,M<><4D><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
do
|
|||
|
{
|
|||
|
product = M * k + 1;
|
|||
|
if(!(product % E))
|
|||
|
{
|
|||
|
pblc_keys.public_key = E;
|
|||
|
pblc_keys.divider = N;
|
|||
|
|
|||
|
prvt_keys.private_key = product/E;
|
|||
|
prvt_keys.divider = N;
|
|||
|
|
|||
|
#ifdef DEBUG_MODE
|
|||
|
rsa_dump();
|
|||
|
#endif
|
|||
|
return 0;
|
|||
|
}
|
|||
|
k ++;
|
|||
|
}
|
|||
|
while(1);
|
|||
|
}
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
void rsa_dump(void)
|
|||
|
{
|
|||
|
printf("base value\n");
|
|||
|
printf("M = %d(%d * %d), N = %d(%d * %d)\n", M, P-1, Q-1, N, P, Q);
|
|||
|
|
|||
|
printf("public key: \n");
|
|||
|
printf("{e, n} = %d, %d\n", pblc_keys.public_key, pblc_keys.divider);
|
|||
|
|
|||
|
printf("private key: \n");
|
|||
|
printf("{d, n} = %d, %d\n", prvt_keys.private_key, prvt_keys.divider);
|
|||
|
}
|
|||
|
|
|||
|
void rsa_encrypt( unsigned *input, unsigned int length, unsigned *output )
|
|||
|
{
|
|||
|
unsigned int i;
|
|||
|
|
|||
|
for(i=0;i<length;i++)
|
|||
|
{
|
|||
|
debug("rsa_encrypt %d start\n", i);
|
|||
|
output[i] = probe_high_level_power_mod(input[i], pblc_keys.public_key, pblc_keys.divider);
|
|||
|
debug("rsa_encrypt %d end\n", i);
|
|||
|
}
|
|||
|
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void rsa_decrypt( unsigned *input, unsigned int length, unsigned *output )
|
|||
|
{
|
|||
|
unsigned int i;
|
|||
|
|
|||
|
for(i=0;i<length;i++)
|
|||
|
{
|
|||
|
output[i] = probe_high_level_power_mod(input[i], prvt_keys.private_key, prvt_keys.divider);
|
|||
|
}
|
|||
|
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|