代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C/C++
】
非对称加密算法的原理
作者:
哲天
/ 发布于
2016/6/27
/
981
/* * 本代码只实现一个简单的RSA加密算法。生成基本的公钥和密钥。 * * 让我写这个的想法是,在工作中很多人都会使用,用Java PHP C C++ ... * * 总之有各种各样的语言,但很多使用的人并不明白期中的原理,只有当我们明 * * 白期中的数学原理后,就可以最小化的实现我们自己的加解密算法,所以本节 * * 代码实只体现数学原理,并不考虑实际的应用。 * * ********************************************************************/ #include <stdio.h> #include <time.h> #include <math.h> #include <stdbool.h> typedef struct { int m_nPublic; // Public key int m_nPrivate; // Private key int m_nCircle; // Circle the number }SecretKey; /* * JudgePrimeNumber is a tool function. * ***********************************************************************/ bool JudgePrimeNumber( int nNumber ) { /* * Function : To determine whether unNumber is a prime number? * Percondition : NULL * Postcondition: Is to return true,no return false. * *************************************************************/ int i = 2; while( i < nNumber ) { if( nNumber % i == 0 ) break; i++; } if( i == nNumber ) return true; else return false; } int GenerateRandomNumber( int nMin, int nMax ) { /* * Function : Generate a greater than nMin random number less than nMax. * Percondition : nMax > nMin; * Postcondition: Return a random number. * *************************************************************/ int nRandom, i = nMax - nMin; srand( time( 0 ) ); while( i < nMax ){ nRandom = rand() % nMax; if( nMin < nRandom ) return nRandom; i++; } return 0; } int GenerateRandomPrimeNumber( int nMin ) { /* * Function : Generate a prime number of random. * Percondition : 0 < nMin < 900 * Postcondition: Return a random prime number. * *************************************************************/ int i, nRandom = 0; for( i = nMin ; i < 1000; i++ ) if( JudgePrimeNumber( i ) ) return i; return 0; } int LeastCommonMultiple( int nA,int nB ) { /* * Function : Seek nA and nB common multiple * Percondition : NULL * Postcondition: Return nA and nB common multiple * *************************************************************/ int i; for( i = 1; ; i++ ) if( i % nA == 0 && i % nB ==0 ) break; return i; } int Gcd( int nx, int ny ) { /* * Function : Seek nx and ny greatest common divisor. * * ************************************************************/ if( nx < ny ) return Gcd( ny, nx ); if( 0 == ny ) return nx; else { if( 0 == ( nx % 2 ) ) { if( 0 == ( ny % 2 ) ) return ( Gcd( nx >> 1,ny >> 1 ) << 1 ); else return Gcd( nx >> 1, ny ); } else { if( 0 == ( ny % 2 ) ) return Gcd( nx ,ny >> 1 ); else return Gcd( ny, nx - ny ); } } } int GreatestCommonDivisor( int nNumber ) { /* * Function : Generate the Greatest common divisor of 1 and * nNumber number; * Percondition : NULL * Postcondition: Return the Greatest common divisor of 1 and * nNumber number; * *************************************************************/ int nTemp = 0,nRet = 0; nTemp = GenerateRandomNumber( 50,100 ); while( nTemp < 200 ) { nRet = Gcd( nTemp, nNumber ); if( nRet == 1 ) return nTemp; nTemp++; } return 0; } int IndexCalculate( int nNumber, int nIndex,int nMod ) { /* * Function : nNumber ^ nIndex % nMod * Percondition : nNumber < nMod * Postcondition: Return nNumber ^ nIndex % nMode is values. * *************************************************************/ int nt = 1,nTemp = nNumber; while( nIndex != 0 ) { if( 1 == nIndex % 2 ) nt = nt * nTemp % nMod; nTemp = nTemp * nTemp % nMod; nIndex /= 2; } return nt; } /* * * Use GenerateSecretKey function generate secret key. * * Use Encryption function encryption express. * * Use DecryptFuction function decrypt ciphertext. * * *********************************************************************/ int Encryption( int nExpress,SecretKey sk) { /* * Function : Use sk encryption express. * Percondition : n < * Postcondition: Return ciphertext. * *************************************************************/ int nCiphertext = 0; nCiphertext = IndexCalculate( nExpress,sk.m_nPublic,sk.m_nCircle); return nCiphertext; } int Decrypt( int nCiphertext,SecretKey sk) { /* * Function : Use sk decrypt ciphertext * Percondition : * Postcondition: Return express. * *************************************************************/ int nExpress = 0; nExpress = IndexCalculate( nCiphertext, sk.m_nPrivate, sk.m_nCircle ); return nExpress; } void PrintKey( SecretKey sk ) { /* * Function : Print secret key * * *************************************************************/ printf("公钥:%.2d %.2d\n密钥:%.2d %.2d\n ",sk.m_nPublic,\ sk.m_nCircle, sk.m_nPrivate,sk.m_nCircle); } SecretKey GenerateSecretKey( void ) { /* * Function : Generate public key and private key. * Percondition : NULL * Postcondition: Return secret key. * *************************************************************/ int na = 0, nb = 0, nTemp, i = 0; SecretKey stKey = {0}; na = GenerateRandomPrimeNumber( GenerateRandomNumber( 10,50 ) ); nb = GenerateRandomPrimeNumber( GenerateRandomNumber( 70,100 ) ); stKey.m_nCircle = na * nb; nTemp = LeastCommonMultiple( na - 1, nb - 1 ); stKey.m_nPublic = GreatestCommonDivisor( nTemp ); i = GenerateRandomNumber( 10, 50 ); while( i++ ) { if( ( stKey.m_nPublic * i ) % nTemp == 1 ) { stKey.m_nPrivate = i; break; } } return stKey; } /* * main函数中只提供实现实例。 * ***********************************************************************/ int main(void) { int nText,nTemp = 0; SecretKey stKey = {0}; stKey = GenerateSecretKey(); while( stKey.m_nPrivate == stKey.m_nPublic ) stKey = GenerateSecretKey(); PrintKey( stKey ); printf("请输入明文(%d < Number < -%d):",stKey.m_nCircle - 2, \ stKey.m_nCircle - 2 ); scanf("%d",&nTemp); nText = Encryption( nTemp, stKey ); printf(" 密文: %d \n",nText ); nText = Decrypt( nText, stKey ); printf(" 明文: %d \n",nText ); return 0; }
试试其它关键字
非对称加密
同语言下
.
C分鱼问题
.
链表
.
最大连续和
.
编码字符串
.
libiconv字符编码处理及判断字符串是否为utf8
.
一组数中两两二元组,差最大有几对,差最小呢?(数组
.
通过管道获取一个进程的执行状态
.
多关键字排序
.
字符串字典序排序
.
3元一次方程(牛顿迭代法求方程的根)
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
哲天
贡献的其它代码
(
14
)
.
Redis通用操作类
.
SQL重复记录查询
.
c#中queue队列用法
.
Springmvc 服务器端文件下载
.
like语句的使用
.
获取浏览器信息和页面信息
.
读取excel 可以多个模板同一连接遍历
.
查询某个字段在数据库中是否存在记录,如果存在,则更
.
非对称加密算法的原理
.
使用系统方法发送异步邮件
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3