• 大小: 5KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: C/C++
  • 标签: ELGamal  

资源简介

ELGamal加解密(c语言实现) ELGamal是非对称加密算法,和RSA类似 ELGamal密码体制是T.ElGamal在1985年提出的公钥密码体制。

资源截图

代码片段和文件信息

#include 
#include 
#include “elgamal.h“
#include 

using namespace std;

//! 宏定义,固定素数P
#define PRIME_P 9871
//! 宏定义,固定本原元素
#define PRIME_G 7527
//! 宏定义,加密随机值
#define RANDOM 1795

/******************************************************************************/
// 名称:IsNumber
// 功能:判断数字字符数组
//  参数:strNumber:字符数组
// 返回:数字字组数组返回true,否则返回false;

/******************************************************************************/
bool IsNumber( const char *strNumber )
{
int i;

if( !strNumber )
return false;

for ( i = 0 ; i < strlen(strNumber) ; i++ )
{
if ( strNumber[i] < ‘0‘ || strNumber[i] > ‘9‘ )
return false;
}

return true;
}

/******************************************************************************/
// 名称:PublicKey
// 功能:由私钥生成公钥
//  参数:xKey:私钥X(整数)
// 返回:公钥yKey(整数)
//  备注:固定素数P与本原元素

/******************************************************************************/
unsigned int PublicKey( unsigned int xKey )
{
unsigned int yKey;

//! 私钥取值应在区间[0 PRIME_P)
if( xKey >= PRIME_P )
return 0;

yKey = PRIME_G;
if( xKey != 0 )
{
for( unsigned int i=1; i yKey = ( yKey * PRIME_G) % PRIME_P;

}
else
yKey = 1;

return yKey;
}

/******************************************************************************/
// 名称:ELGamal_encrypt
// 功能:加密
//  参数:yKey:加密公钥;mw:指向明文缓冲区;clw:密文输出c1;c2w:密文输出c2(保存密文)
// 返回:加密成功返回true,否则返回false
//  备注:固定素数P、本原元素和加密随机值

/******************************************************************************/
bool ELGamal_encrypt( int yKey char * mw int &c1w int *&c2w )
{
int i;
std::string mTem(mw);

int mLong = (int)mTem.length();
char *m = new char[mLong];

for( i = 0; i < mLong; i++)
m[i] = mTem.at(i);

if( !( RANDOM>0 && RANDOM return false;

int c1 = PRIME_G;
int k = yKey;
for( i = 1; i  {
c1 = ( c1 * PRIME_G ) % PRIME_P;
k = ( k * yKey ) % PRIME_P;
}

for( i = 0; i < mLong; i++)
c2w[i] = ( m[i] * k ) % PRIME_P;

c1w = c1;

//! 别忘记释放内存空间
delete [] m;
return true;
}

/******************************************************************************/
// 名称:ELGamal_decrypt
// 功能:解密
//  参数:xKey:解密私钥;cw:指向密文缓冲区;clw:密文输出;c2w:密文输出
//   mw:指向明文缓冲区;cLong:密文c2中数据段(以“”间隔)
// 返回:解密成功返回true,否则返回false
//  备注:固定素数P和本原元素

/******************************************************************************/
bool ELGamal_decrypt( int xKey int c1w int *c2w char *mw int cLong )
{
int kb = c1w;

if ( xKey != 0 )
{
for( int i = 1; i < xKey; i++ )
kb = ( kb * c1w ) % PRIME_P;
}
else
{
kb = 1;
}

int kReciprocal = 1;
int rslt = 0;
for ( kReciprocal; rslt != 1; kReciprocal++ )
{
rslt = ( kb * kReciprocal ) % PRIME_P;//求k的倒数kReciprocal
}
kReciprocal--;

for( int i = 0; i < cLong; i++ )
{
mw[i] = ( kReciprocal * c2w[i] ) % PRIME_P;
}

return true;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-12-06 23:57  ELGamal\
     文件        3253  2009-12-10 18:55  ELGamal\ELGamal.cpp
     文件         258  2009-12-10 18:58  ELGamal\ELGamal.h
     文件        4800  2009-12-10 18:56  ELGamal\main.cpp
     文件        1494  2016-12-10 18:17  ELGamal.txt

评论

共有 条评论