0/5 (1 avis)
Snippet vu 7 379 fois - Téléchargée 31 fois
typedef struct { unsigned __int64 N; unsigned __int64 E; unsigned __int64 D; }TYP_RSA; CInternCrypt::CInternCrypt() { TYP_RSA Key; GetRandomKey(&Key); char Toto[80]; // Attention peut être alimenté après son strlen dans la fct encrypt UINT Lg = sprintf(Toto,"Essai de cryptage par RSA version SLX 123456"); unsigned long Start = time(NULL); Encrypt(Toto,&Lg,Key.E,Key.N); unsigned long EncryptTime = time(NULL) - Start; Sleep(1); // Juste mis un break point pour verifier Start = time(NULL); Decrypt(Toto,&Lg,Key.D,Key.N); unsigned long DecryptTime = time(NULL) - Start; Sleep(1); // Juste mis un break point pour verifier } CInternCrypt::~CInternCrypt() { } void CInternCrypt::GetRandomKey(TYP_RSA *Key) { unsigned __int64 TabTmp[563]; unsigned __int64 Cur = 1; unsigned __int64 Nbr = 0; memset(TabTmp,0,sizeof(TabTmp)); do { BOOL Valid = TRUE; Cur += 2; for(unsigned __int64 i=0;i<Nbr && Valid;i++) { if((Cur % TabTmp[i]) == 0) { Valid = FALSE; // Divisable par un premier déjà ds le tableau } } if(Valid) { TabTmp[Nbr] = Cur; // C'est un nombre premier Nbr++; } } while(Nbr < 563); srand( (unsigned)time( NULL ) ); unsigned __int64 P = TabTmp[408 + (rand() % 155)]; unsigned __int64 Q; while((Q = TabTmp[408 + (rand() % 155)]) == P); unsigned __int64 Euler = (P-1)*(Q-1); Key->D = 17; // Clé privée while((Euler % Key->D) == 0) { Key->D+=2; } Key->N = P * Q; // le bigame !!!! unsigned __int64 k=0; do { k++; Key->E = ((1+(k*Euler))/Key->D) ; // Determiner clé publique } while(k < Euler && (((1+(k*Euler))%Key->D) !=0)); } void CInternCrypt::Encrypt(char *Trame,UINT *Len,unsigned __int64 E,unsigned __int64 N) { union { unsigned __int64 Num; unsigned char Alpha[8]; // 8 chars pour être = à la taille d' __int64 }Work; char Tmp[1024]; while((*Len % 3) != 0) // On ajuste à un multiple de 3 octets (24 bits) {
28 mai 2004 à 09:59
a^n modulo n se calcul comme cela :
int expMod(int a, int b, Int n)
{
int m = a;
int e = b;
int x = 1;
while(e != 0)
{
while(e%2==0)
{
e >>= 1;
m = (m * m) % n;
}
e--;
x = (x * m) % n;
}
return x;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.