rsa加密算法源代码c++实现
基于C语言的RSA算法高效实现

提 高公 钥 加 密 的 速度 是 非 常 重要 的 。
ff(sP w rn ) i o e ( ) i
Re u : t m 0
21 快速 实 现模 运 算 .
从 R A 算 法 的 过 程 可 以 知 道 , 数 运 算 占有 很 大 S 指 的 比例 . 我 们 一般 是 使 用 降 阶 的方 法 实 现 的 , 种 方 而 这 法 的 缺 点 就 是 占用 了 大 量 的 内存 空 间 。 为 了 有 效 地 进 行 指 数 运 算 . 每 次执 行 乘 法 前 先 用 模 的方 法 来 降 阶 , 在 具体 做 法 如 下 : 已 知 M= m23 4 1 0 : ml m m …m , = b …b, m 6 有
R mi(i d n /) 4 ( g n ) ; = n f r(,r> 1 ( ) ) o z o 2 F r a 2a = ; + o(= ; r + ) < a
{c = c ( , ; gd g d an) I(c > &&g d n) fg d 1 c<
已知 : 密文 C和私钥 s= n d 。 k ( 。)
计 算 明文 : mCm d M J 0n
公 钥密码体制 。 也是公钥 密码 的国际标 准。 S R A算法基 于几百年来 广为流传 的初 等数论知识 . 实上 . 的安 事 它
全 性 是 建 立 在 大 整 数 因子 分 解 难 题 的基 础 之 上 由 于 进行 的都是大数计 算 . 得 R A最快 的情况 也 比 D S 使 S E
要 使 R A 安 全 , , 需 选 择 足 够 大 的素 数 , 样 S p 口必 这 攻 击 者 没 有 办 法 在 有 效 的 多项 式 时 间 内分 解 出 n 一 般 .
C#RSA加密解密无长度限制

C#RSA加密解密⽆长度限制加密,采⽤分段的⽅式,⽆长度限制:public string RsaEncrypt(string rawInput, string publicKey){if (string.IsNullOrEmpty(rawInput)){return string.Empty;}if(string.IsNullOrWhiteSpace(publicKey)){throw new ArgumentException("Invalid Public Key");}using (var rsaProvider = new RSACryptoServiceProvider()){var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流rsaProvider.FromXmlString(publicKey);//载⼊公钥int bufferSize = (rsaProvider.KeySize / 8) - 11;//单块最⼤长度var buffer = new byte[bufferSize];using (MemoryStream inputStream = new MemoryStream(inputBytes),outputStream = new MemoryStream()){while (true){ //分段加密int readSize = inputStream.Read(buffer, 0, bufferSize);if (readSize <= 0){break;}var temp = new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var encryptedBytes = rsaProvider.Encrypt(temp, false);outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);}return Convert.ToBase64String(outputStream.ToArray());//转化为字节流⽅便传输}}}解密,必须对应:public string RsaDecrypt(string encryptedInput, string privateKey){if (string.IsNullOrEmpty(encryptedInput)){return string.Empty;}if (string.IsNullOrWhiteSpace(privateKey)){throw new ArgumentException("Invalid Private Key");}using (var rsaProvider = new RSACryptoServiceProvider()){var inputBytes = Convert.FromBase64String(encryptedInput);rsaProvider.FromXmlString(privateKey);int bufferSize = rsaProvider.KeySize / 8;var buffer = new byte[bufferSize];using (MemoryStream inputStream = new MemoryStream(inputBytes),outputStream = new MemoryStream()){while (true){int readSize = inputStream.Read(buffer, 0, bufferSize);if (readSize <= 0){break;}var temp = new byte[readSize];Array.Copy(buffer, 0, temp, 0, readSize);var rawBytes = rsaProvider.Decrypt(temp, false);outputStream.Write(rawBytes, 0, rawBytes.Length);}return Encoding.UTF8.GetString(outputStream.ToArray());}}}。
RC4加密算法C语言实现

}
得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
RC4加密算法在C++中的实现:
RC4函数(加密/解密):其实RC4只有加密,将密文再加密一次,就是解密了。
GetKey函数:随机字符串产生器。
ByteToHex函数:把字节码转为十六进制码,一个字节两个十六进制。十六进制字符串 非常适合在HTTP中传输。
HexToByte函数:把十六进制字符串,转为字节码。。
Encrypt函数:把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用 于传输。
Decrypt函数:直接密码十六进制字符串密文,再解密,返回字符串明文。
源代码
以下为Encrypt.h文件代码
#ifndef _ENCRYPT_RC4_
#defi ne _ENCRYPT_RC4_
#in clude <stri ng.h>
#defi ne BOX_LEN 256
int GetKey(c onst un sig ned char* pass, int pass_le n, un sig ned char *out);
int RC4(c onst un sig ned char* data, int data_le n, const un sig ned char* key, int key_le n, un sig ned char* out, i nt* out_le n);
char* ByteToHex(c onst un sig ned char* vByte, const int vLe n); //把字节码pbBuffer转为十六进
C#与JAVA的RSA加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,。。。

C#与JAVA的RSA加密解密交互,互通,C#使⽤BouncyCastle来实现私钥加密,。
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密。
在⽹上查了很久也没有很好的实现。
BouncyCastle的⽂档少之⼜少。
很多⼈可能会说,C#也是可以的,通过Biginteger开源类来实现,不过那个是有⼀个⽂章,不过他加密出来的是16进制结果的。
根本不能和JAVA互通。
连加密出来的都不和C#原⽣的加密出来的结果格式⼀样。
所以还是没有好的解决⽅法。
接下来还是不断的找资料,找⽅法。
找朋友找同事。
个个都找。
问题是有的,⽅法也是有的,所以总结各路⼤神之后写了这个类。
实现了私钥加密,公钥解密。
并通过在线的校验之后,发布上来。
⼤家可以做⼀个DEMO,然后进去在线RSA加密解密校验。
在线RSA,DES等加密解密地址:下⾯直接粘贴代码,不多说:BouncyCastle相关DLL,估计不⽤我多说,⼤家可以百度下载。
然后引⽤就可以了!using System;using System.Collections.Generic;using System.Linq;using System.Text;using Org.BouncyCastle.Asn1.Pkcs;using Org.BouncyCastle.Asn1.X509;using Org.BouncyCastle.Crypto.Generators;using Org.BouncyCastle.Crypto.Parameters;using Org.BouncyCastle.Math;using Org.BouncyCastle.Pkcs;using Org.BouncyCastle.Security;using Org.BouncyCastle.Crypto.Engines;using Org.BouncyCastle.X509;using Org.BouncyCastle.Crypto;using Org.BouncyCastle.Asn1;using Org.BouncyCastle.Crypto.Encodings;namespace CryptionUtils{public class RSAForJava{public RSAForJava(){}/// <summary>/// KEY 结构体/// </summary>public struct RSAKEY{/// <summary>/// 公钥/// </summary>public string PublicKey{get;set;}/// <summary>/// 私钥/// </summary>public string PrivateKey{get;set;}}public RSAKEY GetKey(){//RSA密钥对的构造器RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();//RSA密钥构造器的参数RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(Org.BouncyCastle.Math.BigInteger.ValueOf(3),new Org.BouncyCastle.Security.SecureRandom(),1024, //密钥长度25);//⽤参数初始化密钥构造器keyGenerator.Init(param);//产⽣密钥对AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();//获取公钥和密钥AsymmetricKeyParameter publicKey = keyPair.Public;AsymmetricKeyParameter privateKey = keyPair.Private;SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);Asn1Object asn1ObjectPublic = subjectPublicKeyInfo.ToAsn1Object();byte[] publicInfoByte = asn1ObjectPublic.GetEncoded("UTF-8");Asn1Object asn1ObjectPrivate = privateKeyInfo.ToAsn1Object();byte[] privateInfoByte = asn1ObjectPrivate.GetEncoded("UTF-8");RSAKEY item = new RSAKEY(){PublicKey =Convert.ToBase64String(publicInfoByte),PrivateKey=Convert.ToBase64String(privateInfoByte)};return item;}private AsymmetricKeyParameter GetPublicKeyParameter(string s){s = s.Replace("\r", "").Replace("\n", "").Replace(" ","");byte[] publicInfoByte = Convert.FromBase64String(s);Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这⾥也可以从流中读取,从本地导⼊AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);return pubKey;}private AsymmetricKeyParameter GetPrivateKeyParameter(string s){s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");byte[] privateInfoByte = Convert.FromBase64String(s);// Asn1Object priKeyObj = Asn1Object.FromByteArray(privateInfoByte);//这⾥也可以从流中读取,从本地导⼊// PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);AsymmetricKeyParameter priKey = PrivateKeyFactory.CreateKey(privateInfoByte);return priKey;}public string EncryptByPrivateKey(string s,string key){//⾮对称加密算法,加解密⽤IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());//加密try{engine.Init(true, GetPrivateKeyParameter(key));byte[] byteData = System.Text.Encoding.UTF8.GetBytes(s);var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);return Convert.ToBase64String(ResultData);//Console.WriteLine("密⽂(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine);}catch (Exception ex){return ex.Message;}}public string DecryptByPublicKey(string s,string key){s = s.Replace("\r", "").Replace("\n", "").Replace(" ", "");//⾮对称加密算法,加解密⽤IAsymmetricBlockCipher engine = new Pkcs1Encoding( new RsaEngine());//解密try{engine.Init(false, GetPublicKeyParameter(key));byte[] byteData = Convert.FromBase64String(s);var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length);return System.Text.Encoding.UTF8.GetString(ResultData);}catch (Exception ex){return ex.Message;}}} }。
C#Sha256+RSA加密代码

C#Sha256+RSA加密代码/// <summary>/// ras加密/// </summary>public class SHA256WithRSAHelper{#region 加解密/// <summary>/// 加密/// </summary>/// <param name="contentForSign">待加密数据</param>/// <param name="privateKey">私钥</param>/// <param name="isHandleKey">是否需要处理私钥</param>/// <returns></returns>public static string Sign(string contentForSign, string privateKey,bool isHandleKey = false){if (isHandleKey){privateKey = RSAPrivateKeyJava2DotNet(privateKey);}var rsa = new RSACryptoServiceProvider();rsa.FromXmlString(privateKey);//创建⼀个空对象//var rsaClear = new RSACryptoServiceProvider();//var paras = rsa.ExportParameters(true);//rsaClear.ImportParameters(paras);//签名返回using (var sha256 = new SHA256CryptoServiceProvider()){var signData = rsa.SignData(Encoding.UTF8.GetBytes(contentForSign), sha256);return Convert.ToBase64String(signData);}}/// <summary>/// 验签/// </summary>/// <param name="sEncryptSource">加密的数据</param>/// <param name="sCompareString">未加密原数据</param>/// <param name="sPublicKey">公开密钥</param>/// <param name="isHandleKey">是否需要处理私钥</param>/// <returns></returns>public static bool VerifySign(string sEncryptSource, string sCompareString, string sPublicKey, bool isHandleKey = false) {if (isHandleKey){sPublicKey = RSAPublicKeyJava2DotNet(sPublicKey);}RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();rsa.FromXmlString(sPublicKey);rsa.PersistKeyInCsp = false;bool bVerifyResultOriginal = rsa.VerifyData(Encoding.UTF8.GetBytes(sCompareString), "SHA256",Convert.FromBase64String(sEncryptSource));return bVerifyResultOriginal;}#endregion#region 证书加解密/// <summary>/// 加密/// </summary>/// <param name="contentForSign">待加密数据</param>/// <param name="certPath">证书路径</param>/// <param name="certPassword">证书密码</param>/// <returns></returns>public static string CertSign(string contentForSign, string certPath, string certPassword){//证书var cert = CertificateHelper.GetCertHelper(certPath, certPassword);//创建RSA对象并载⼊[公钥]RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;rsa.ExportParameters(false);//创建⼀个空对象//var rsaClear = new RSACryptoServiceProvider();//var paras = rsa.ExportParameters(false);//rsaClear.ImportParameters(paras);//签名返回using (var sha256 = new SHA256CryptoServiceProvider()){var signData = rsa.SignData(Encoding.UTF8.GetBytes(contentForSign), sha256);return Convert.ToBase64String(signData);}}/// <summary>/// 验签/// </summary>/// <param name="sEncryptSource">加密的数据</param>/// <param name="sCompareString">未加密原数据</param>/// <param name="certPath">证书路径</param>/// <param name="certPassword">证书密码</param>/// <returns></returns>public static bool CertVerifySign(string sEncryptSource, string sCompareString, string certPath, string certPassword){//证书var cert = CertificateHelper.GetCertHelper(certPath, certPassword);//创建RSA对象并载⼊[公钥]RSACryptoServiceProvider rsa = cert.PublicKey.Key as RSACryptoServiceProvider;rsa.PersistKeyInCsp = false;bool bVerifyResultOriginal = rsa.VerifyData(Encoding.UTF8.GetBytes(sCompareString), "SHA256",Convert.FromBase64String(sEncryptSource));return bVerifyResultOriginal;}#endregion/// <summary>/// rsa私钥格式转换/// </summary>/// <param name="privateKey"></param>/// <returns></returns>public static string RSAPrivateKeyJava2DotNet(string privateKey){var baseStr = Convert.FromBase64String(privateKey);RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(baseStr);return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5} </DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));}/// <summary>/// RSA公钥格式转换/// </summary>/// <param name="publicKey">java⽣成的公钥</param>/// <returns></returns>public static string RSAPublicKeyJava2DotNet(string publicKey){var baseStr = Convert.FromBase64String(publicKey);RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(baseStr);return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));}}注意:公钥和私钥格式转换时,公钥和私钥要去掉开头-----BEGIN PUBLIC KEY-----和结尾-----END PUBLIC KEY-----。
openssl rsa c++用法

openssl rsa c++用法OpenSSL 是一个强大的加密库,它可以用于在C++ 程序中执行各种加密和解密操作,包括RSA 密钥的生成、加密和解密。
以下是一个简单的示例,演示如何在C++ 中使用OpenSSL 来生成RSA 密钥、加密和解密数据。
请注意,使用OpenSSL 需要安装OpenSSL 库并包含正确的头文件。
此示例假设您已经配置了OpenSSL 环境。
```cpp#include <iostream>#include <openssl/rsa.h>#include <openssl/pem.h>#include <openssl/err.h>int main() {// 初始化OpenSSL 库OpenSSL_add_all_algorithms();ERR_load_crypto_strings();// 生成RSA 密钥对RSA *rsa = RSA_generate_key(2048, RSA_F4, nullptr, nullptr);if (rsa == nullptr) {std::cerr << "Failed to generate RSA key pair." << std::endl;return 1;}// 加密和解密数据const char *plaintext = "Hello, RSA!";size_t plaintext_len = strlen(plaintext);unsigned char encrypted[256]; // 大小足够存放加密后的数据unsigned char decrypted[256]; // 大小足够存放解密后的数据int encrypted_len = RSA_public_encrypt(plaintext_len, (const unsigned char*)plaintext, encrypted, rsa, RSA_PKCS1_PADDING);if (encrypted_len == -1) {std::cerr << "Encryption failed." << std::endl;return 1;}int decrypted_len = RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa, RSA_PKCS1_PADDING);if (decrypted_len == -1) {std::cerr << "Decryption failed." << std::endl;return 1;}std::cout << "Original Text: " << plaintext << std::endl;std::cout << "Encrypted Text: ";for (int i = 0; i < encrypted_len; ++i) {printf("%02X", encrypted[i]);}std::cout << std::endl;std::cout << "Decrypted Text: " << decrypted << std::endl;// 释放RSA 密钥RSA_free(rsa);// 清理OpenSSL 资源ERR_free_strings();EVP_cleanup();return 0;}```上述示例中,我们首先初始化OpenSSL 库,然后生成了一个2048 位的RSA 密钥对。
Python中如何使用RSA算法进行加密和解密
Python中如何使用RSA算法进行加密和解密RSA算法是一种非对称加密算法,它是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。
它被广泛用于网络通信、数字签名、身份验证等领域。
Python语言可以很方便地使用RSA算法进行加密和解密,本文将详细介绍如何在Python中使用RSA算法。
一、RSA算法原理RSA算法的核心原理是利用欧拉定理和模运算,实现非对称加密。
具体过程如下:1.选择两个质数p和q,计算N=p*q,并求出其欧拉函数φ(N)=(p-1)*(q-1)。
2.选择一个整数e,使得1<e<φ(N),且e和φ(N)互质。
3.计算e关于φ(N)的模反元素d,即d*e=1 mod φ(N)。
4.公钥为(p, q, e),私钥为(p, q, d)。
5.加密时,将明文m用公钥加密成密文c:c=m^e mod N。
6.解密时,将密文c用私钥解密成明文m:m=c^d mod N。
二、Python中使用RSA算法Python中使用RSA算法,需要使用pycryptodome库。
安装方法如下:pip install pycryptodome使用方法如下:1.生成密钥对使用RSA模块中的generate函数生成RSA密钥对。
如下:from Crypto.PublicKey import RSAkey = RSA.generate(2048)其中,2048为密钥长度,可以根据需要设置。
2.获取公钥和私钥生成密钥对之后,可以使用exportKey函数获取公钥和私钥。
如下:public_key = key.publickey().exportKey()private_key = key.exportKey()此时,public_key为公钥,private_key为私钥。
3.加密和解密使用RSA密钥对进行加密和解密时,需要使用RSA模块中的encrypt和decrypt函数。
AES加密算法(C++实现,附源码)
AES加密算法(C++实现,附源码)原创作品,转载请注明出⾃博客地址:本⽂地址:快毕业了,最后⼀个课程设计,《基于Windows Socket的安全通信》,内容就是基于AES加密的SOCKET通信,貌似挺简单,不过要⽤VC++6.0开发,C++我确实没有任何代码经验,虽然不是强制性,但由于机房⾥各种纠结,只能⽤它了(⽤Java没有挑战性,封装得太好了...也算熟悉下VC++吧)先搞定AES算法,基本变换包括SubBytes(字节替代)、ShiftRows(⾏移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加)其算法⼀般描述为明⽂及密钥的组织排列⽅式ByteSubstitution(字节替代)⾮线性的字节替代,单独处理每个字节:求该字节在有限域GF(28)上的乘法逆,"0"被映射为⾃⾝,即对于α∈GF(28),求β∈GF(28),使得α·β=β·α=1mod(x 8+x 4+x 2+x+1)。
对上⼀步求得的乘法逆作仿射变换y i =x i + x (i+4)mod8 + x (i+6)mod8 + x (i+7)mod8 + c i(其中c i 是6310即011000112的第i位),⽤矩阵表⽰为本来打算把求乘法逆和仿射变换算法敲上去,最后还是放弃了...直接打置换表12345678910111213141516171819unsigned char sBox[] ={ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, /*0*/0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, /*1*/0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, /*2*/ 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, /*3*/ 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, /*4*/0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, /*5*/0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, /*6*/0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, /*7*/0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, /*8*/ 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, /*9*/ 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, /*a*/0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, /*b*/0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, /*c*/0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, /*d*/ 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, /*e*/ 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16 /*f*/};下⾯是逆置换表,解密时使⽤12345678*********unsigned char invsBox[256] ={ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, /*0*/ 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, /*1*/ 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, /*2*/0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, /*3*/0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, /*4*/0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, /*5*/ 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, /*6*/ 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, /*7*/ 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, /*8*/0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, /*9*/0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, /*a*/ 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, /*b*/14 15 16 17 18 19 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, /*c*/ 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, /*d*/ 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, /*e*/ 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d /*f*/ };这⾥遇到问题了,本来⽤纯c初始化数组很正常,封装成类以后发现不能初始化,不管是声明、构造函数都⽆法初始化,百歌⾕度了⼀通后没有任何答案,⽆奈只能在构造函数中声明⼀个局部变量数组并初始化,然后⽤memcpy,(成员变量名为Sbox/InvSbox,局部变量名sBox/invsBox)12 3 4 5 6 7 8 9 10 11void AES::SubBytes(unsigned char state[][4]) {int r,c;for(r=0; r<4; r++){for(c=0; c<4; c++){state[r][c] = Sbox[state[r][c]];}}}ShiftRows(⾏移位变换)⾏移位变换完成基于⾏的循环位移操作,变换⽅法:即⾏移位变换作⽤于⾏上,第0⾏不变,第1⾏循环左移1个字节,第2⾏循环左移2个字节,第3⾏循环左移3个字节。
python实现RSA的加解密
三、RSA 算法实现代码
#Author: Wendezhi #Date: 2013/5/23 #导入 random 类库 import random random 模块包含许多随机数生成器. 基本随机数生成器(基于 Wichmann 和 Hill , 1982 的数学运算理论)
#RSA_解密模块 def RSA_jiemi(d,n,tep): M=[] for i in tep: M.append(pow( i,d,n )) a=' ' for i in M: a=a+chr(i)#强制转换为字符,组合 print '明文为:',a #RSA_加密模块 def RSA_jiami(e,n): M=raw_input('s 输入明文以加密:') M=M.lower()#a 的 ascii 码为 C=[]#密文输出 for i in M: ''' pow()函数返回以 x 为底,y 为指数的幂。
1. 获 得 随 机 素数 p,q( 保 密)
2.p,q 产生 n (公开)
p=get_big_number(); q=get_big_number() print 'p=',p; print'---------'; print 'q=',q
密)
仅
(n)(保
n=p*q; print'---------'; print'n=',n euler_n=(p-1)*(q-1);#产生欧拉数 print'---------'; print'euler_n=',euler_n print'---------'; print'n 大于欧拉数_n=',
RSA算法的实现论文
RSA算法的实现摘要本文设计的是一套完整实用的RSA文件加密解决方案,并具体编码实现。
本文采用费马小定理测试素数,使用Montgomery加快大数模乘运算,用C++实现RSA加密算法类库,并在32位windows平台封装成组件。
在.Net平台引用此组件,实现可以对任意文件进行RSA加密操作的窗体应用程序。
经过加密的文件以及密钥文件都是文本文件。
本文首先给出关键类类图、整个应用程序的结构描述文档,然后对关键模块流程图、详细的接口文档进行阐述,并给出关键的实现代码,最后对应用程序进行测试,对测试结果进行分析研究,进而对应用程序进行改进,对关键算法进行尽可能的优化,最终得到一个在windows运行的可以用指定密钥对任意文件进行RSA加密并可解密的完整应用程序,和一些相关的可移植组件。
关键词:RSA;文件加密;Montgomery;费马定理Implement of RSA AlgorithmAbstractIn this paper, a solution of encrypting file with RSA algorithm and the codes of this system are introduced. Fermat theory is used to test prime number. Montgomery is used to cut short the time of modular multiplication of large number. The class library of RSA is implemented in C++, and packaged to component on the platform of 32 bits windows. On the platform of .Net, the application is implemented with reference of this component and can encrypt any file with RSA. Both encrypted files and key files are text files. In this paper, core class figures and the framework are first introduced. Then the flow of core modules and detail interfaces are stated and the kernel codes are showed also. Finally, it analyzes the result of test, then optimizes core algorithm. In the conclusion, an entire application which can encrypt any files with RSA algorithm using given key and some transplanted components are implemented.Key words: RSA ; File Encryption ; Montgomery ; Fermat目录论文总页数:35页1 引言 (1)1.1课题背景 (1)1.2 RSA算法介绍与应用现状 (1)1.3 RSA应用于文件加密的分析 (2)1.3.1 文件加密使用RSA的可行性 (2)1.3.2 文件加密使用RSA的意义 (3)2 RSA文件加密软件的设计与实现 (4)2.1 需求分析与总体设计 (4)2.1.1 功能分析 (4)2.1.2 工程方案选择 (4)2.2 各部分的设计与开发 (5)2.2.1 实现RSA加密算法的C++核心类库 (5)2.2.2 封装C++核心类库的DLL组件 (25)2.2.3 引用DLL的.Net类与实现文件操作功能的窗体应用程序 (26)3 软件整体测试与分析改进 (27)3.1 编写测试各项性能需要的精确计时类 (27)3.2 测试数据与分析改进 (27)3.2.1 密钥生成测试 (27)3.2.2 数据输入输出测试 (28)3.2.3 加密解密测试 (29)结论 (31)参考文献 (32)附录 (33)致谢 (34)声明 (35)1 引言1.1课题背景RSA公钥加密算法是第一个既能用于数据加密也能用于数字签名的算法。