现代密码学第三次实验:不对称加密算法RSA

2023-11-13

前言

为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!

一、实验目的

1、掌握RSA算法的工作原理。
2、熟悉利用素性检测找素数的工作原理。
3、熟悉商业开发时RSA算法的应用。

二、实验环境

Microsoft Visual Studio 2019

三、实验步骤

1.编程实现找素数的算法。
2.编程实现找RSA参数的计算程序。
3.编写一个RSA算法;
4.对2个字符加、解密,改变最低1位明文观察并记录RSA的输出。
5.对2个字符加、解密,改变最高1位明文观察并记录RSA的输出。
6.使用VS平台,以framework为基础,编写RSA加解密程序,观测密钥容器、密钥的产生、导出和导入

四、实验基本方法

1、用C或C++语言编写找素数的算法,并编写RSA参数的计算程序,并将结果显示显示在屏幕上。
2、用C或C++语言编写一个RSA算法,实现其中各关键算法:求逆元、模幂运算(快速指数算法)等;
3、编程实现对32位二进数(3个字符)的加、解密;
4、手工验证加、解密的结果。
5、使用VS平台,以framework为基础,编写RSA加解密程序。
说明:
RSA算法可以自编,也可以网上下载现成算法。

五、实验程序清单

1.程序设计的思想,及程序关键原代码。(见实验程序清单)
2.说明素性检测的原理。(见实验总结)
3.说明RSA参数的e、d计算的原理。(见实验总结)
4.报告对2个字符加、解密,改变最高低和最低1位明文RSA的输出结果。(见实验结果)
5.分析上述输出的原因,手工验证输出的正确性。
6.描述使用framework编写RSA加解密程序的关键点和要注意的问题。

源代码修改如下:

// RSA_sView.cpp : implementation of the CRSA_sView class
//

#include "stdafx.h"
#include "RSA_s.h"

#include "RSA_sDoc.h"
#include "RSA_sView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CRSA_sView

IMPLEMENT_DYNCREATE(CRSA_sView, CFormView)

BEGIN_MESSAGE_MAP(CRSA_sView, CFormView)
	//{{AFX_MSG_MAP(CRSA_sView)
	ON_BN_CLICKED(IDC_BUTTON1_E, OnButton1E)
	ON_BN_CLICKED(IDC_BUTTON1_D, OnButton1D)
	ON_BN_CLICKED(IDC_BUTTON1_p, OnBUTTON1p)
	ON_BN_CLICKED(IDC_BUTTON1_q, OnBUTTON1q)
	ON_BN_CLICKED(IDC_BUTTON1_PARA, OnButton1Para)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/
// CRSA_sView construction/destruction

CRSA_sView::CRSA_sView()
	: CFormView(CRSA_sView::IDD)
{
	//{{AFX_DATA_INIT(CRSA_sView)
	m_p = _T("");
	m_md = _T("");
	m_cd = _T("");
	m_m1d = _T("");
	m_q = _T("");
	m_n = _T("");
	m_e = _T("");
	m_d = _T("");
	m_fn = _T("");
	m_m = _T("");
	m_c = _T("");
	m_m1 = _T("");
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CRSA_sView::~CRSA_sView()
{
}

void CRSA_sView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRSA_sView)
	DDX_Text(pDX, IDC_EDIT1_p, m_p);
	DDX_Text(pDX, IDC_EDIT10_md, m_md);
	DDX_Text(pDX, IDC_EDIT11_cd, m_cd);
	DDX_Text(pDX, IDC_EDIT12_m1d, m_m1d);
	DDX_Text(pDX, IDC_EDIT2_q, m_q);
	DDX_Text(pDX, IDC_EDIT3_n, m_n);
	DDX_Text(pDX, IDC_EDIT4_e, m_e);
	DDX_Text(pDX, IDC_EDIT5_d, m_d);
	DDX_Text(pDX, IDC_EDIT6_fn, m_fn);
	DDX_Text(pDX, IDC_EDIT7_m, m_m);
	DDX_Text(pDX, IDC_EDIT8_c, m_c);
	DDX_Text(pDX, IDC_EDIT9_m1, m_m1);
	//}}AFX_DATA_MAP
}

BOOL CRSA_sView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CRSA_sView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

}

/
// CRSA_sView printing

BOOL CRSA_sView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CRSA_sView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CRSA_sView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CRSA_sView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/
// CRSA_sView diagnostics

#ifdef _DEBUG
void CRSA_sView::AssertValid() const
{
	CFormView::AssertValid();
}

void CRSA_sView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CRSA_sDoc* CRSA_sView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRSA_sDoc)));
	return (CRSA_sDoc*)m_pDocument;
}
#endif //_DEBUG

/
// CRSA_sView message handlers
unsigned long int CRSA_sView::M_R(unsigned long m,unsigned long n)   //Miller--Rabin素性检测法找素数,产生m~n之间的一个素数
{
	unsigned long int p;
	int i,f=0;
	for(;;)
	{
		f=0;
		p=random(m,n);
		if(p%2==0) p=p-1;
		for(i=0;i<50;i++)
		{
			if(RabinMillerKnl(p)==1)
				f++;
		}
		if(f==50)
			return p;
	}
}
//随机数产生器,产生m~n之间的一个随机数
unsigned long CRSA_sView::random(unsigned long m,unsigned long n) 
{ 
	srand((unsigned long)time(NULL)); 
	return (unsigned long)(m+rand()%n); 
} 
//Rabin-Miller素数测试,通过测试返回1,否则返回0。 n是待测素数。
int CRSA_sView::RabinMillerKnl(unsigned long n)
{ 
	unsigned long b, m, j, v, i; 
	m=n-1;   //先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数
	j=0; 
	while(!(m&1)) 
	{ 
		++j; 
		m>>=1; 
	} 
	b=random(2,m);    //随机取一个b,2<=b<n-1
	v=(unsigned long)mod(b, m, n);   //计算v=b^m mod n
	if(v == 1)     //如果v==1,通过测试
	{ 
		return 1; 
	} 
	i=1; 
	while(v != n - 1)  //如果v=n-1,通过测试
	{ 
		if(i == j)   //如果i==l,非素数,结束
		{ 
			return 0; 
		} 
	v=(unsigned long)mod(v, 2, n);   //v=v^2 mod n,i=i+1
	i++; 
	} 
	return 1; 
}
unsigned long int CRSA_sView::inverse(unsigned long x,unsigned long n1)  //扩展欧基里德算法——求逆元
{
	long int x1,x2,x3,y1,y2,y3,q,t1,t2,t3;
	x1=1;x2=0;x3=n1;
	y1=0;y2=1;y3=x;
	for(;;)
	{
		if(y3==0)
		{
			x3=gcd(n1,x);
			return 0;     //没有逆元
		}
		if(y3==1)
		{
			y3=gcd(n1,x);
			if(y2<0) return n1+y2;
			else
				return y2;
		}
		q=x3/y3;
		t1=x1-q*y1;  t2=x2-q*y2;  t3=x3-q*y3;
		x1=y1;  x2=y2;  x3=y3;
		y1=t1;  y2=t2;  y3=t3;
	}
}
unsigned long int CRSA_sView::gcd(unsigned long x,unsigned long y)  //欧基里德算法——求最大公约数
{
	unsigned long int r;
	for(;;)
	{
		if(x%y==0) return y;
		if(y%x==0) return x;
		r=x%y;
		x=y;
		y=r;
	}
}
//指数取模:a的b次方modc=x
_int64 CRSA_sView::mod(_int64 a,_int64 b,_int64 c)//(a)^bmod(c)//条件1:在rsa中a<c,其它不用a<c.条件2:ac互素
{
	_int64 l[500],z=-1,y;
	for(;b!=1;b>>=1)//分解b为2进制数.记录下分解成的位数z,构造栈l
	{
		z++;
		if(b%2==0) l[z]=0;
		else l[z]=1;
	}
//a%=c;//如果一开始数就很大,先模一次,防止过大,   求逆
	y=a*a%c;//第一次模
	for(;z>0;z--)
	{
		if(l[z]) y=(y*a%c)*(y*a%c)%c;
		else y=y*y%c;
	}
	if(l[0]) y=(y*a%c);//最后次模
	return y;
}
unsigned long int CRSA_sView::StrToULong(CString s)	//3个字符的字符串转整数
{
	unsigned long int a;
	char c1,c2,c3,*p;
	p=s.GetBuffer(s.GetLength());
	c1=p[0];
	c2=p[1];
	c3=p[2];
	a=c1*256*256+c2*256+c3;
	return a;
}
CString CRSA_sView::ULongToString(unsigned long int d)		//整数转3个字符的字符串
{
	CString a,b,c,xx;
	unsigned char c1,c2,c3,c4;
	c3=unsigned char(d);
	c2=unsigned char(d/(256));
	c1=unsigned char(d/(256*256));
	a.Format("%c",c1);
	b.Format("%c",c2);
	c.Format("%c",c3);
	a=a+b+c+xx;
	return a;
}

void CRSA_sView::OnButton1E() //加密
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m=StrToULong(m_m);
	m_md.Format("%lu",m);
	c=(unsigned long)mod(m,e,n);
	m_c=ULongToString(c);
	m_cd.Format("%lu",c);
	UpdateData(FALSE);
}

void CRSA_sView::OnButton1D() //解密
{
	// TODO: Add your control notification handler code here
	m1=(unsigned long)mod(c,d,n);
	m_m1=ULongToString(m1);
	m_m1d.Format("%lu",m1);
	UpdateData(FALSE);
}

void CRSA_sView::OnBUTTON1p() //寻找p
{
	// TODO: Add your control notification handler code here
	p=M_R(32768,65535);
	m_p.Format("%lu",p);
	UpdateData(FALSE);
}

void CRSA_sView::OnBUTTON1q() //寻找q
{
	// TODO: Add your control notification handler code here
	q=M_R(8192,16384);
	m_q.Format("%lu",q);
	UpdateData(FALSE);
}

void CRSA_sView::OnButton1Para() //参数计算
{
	// TODO: Add your control notification handler code here
	n=p*q;
	fn=(p-1)*(q-1);
	for(;;)	//寻找e
	{
		e=random(128,256);
		if(gcd(e,fn)==1)
			break;
	}
	d=inverse(e,fn);	//计算d
	m_n.Format("%lu",n);
	m_e.Format("%lu",e);
	m_d.Format("%lu",d);
	m_fn.Format("%lu",fn);
	UpdateData(FALSE);
}

编辑MFC对话框如下:
在这里插入图片描述

源代码修改如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;


namespace RSATest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA1 = new RSACryptoServiceProvider(cspPas);
            RSA1.PersistKeyInCsp = false;
            RSA1.Clear();
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            string str_Public_Key;
            string str_Private_Key;
            str_Public_Key = "";
            str_Private_Key = "";
            str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
            str_Private_Key = Convert.ToBase64String(RSA.ExportCspBlob(true));
            textBox1.Text = str_Public_Key;
            textBox2.Text = str_Private_Key;
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            FileStream fs1 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey1.dat", FileMode.Create, FileAccess.Write);
            string key = RSA.ToXmlString(false);
            fs1.Write(Encoding.UTF8.GetBytes(key), 0, key.Length);
            fs1.Close();
            fs1.Dispose();
            FileStream fs2 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey2.dat", FileMode.Create, FileAccess.Write);
            key = RSA.ToXmlString(true);
            fs2.Write(Encoding.UTF8.GetBytes(key), 0, key.Length);
            fs2.Close();
            fs2.Dispose();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] cipherbytes;
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            cipherbytes = RSA.Encrypt(Encoding.Default.GetBytes(textBox3.Text), false);//RSA_PKCS1_PADDING 
            textBox4.Text = Convert.ToBase64String(cipherbytes);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            byte[] cipherbytes1;
            byte[] cipherbytes2;
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            cipherbytes2 = Convert.FromBase64String(textBox4.Text);
            cipherbytes1 = RSA.Decrypt(cipherbytes2, false);
            textBox5.Text = Encoding.Default.GetString(cipherbytes1);

        }

        private void button5_Click(object sender, EventArgs e)
        {
            byte[] bin = new byte[1000];
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            FileStream fs1 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey1.dat", FileMode.Open, FileAccess.Read);
            string key;
            string str_Public_Key;
            fs1.Read(bin, 0, 1000);
            key = System.Text.Encoding.Default.GetString(bin);
            fs1.Close();
            fs1.Dispose();
            RSA.FromXmlString(key);
            str_Public_Key = "";
            str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
            textBox1.Text = str_Public_Key;
            textBox2.Text = "";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            byte[] bin = new byte[1000];
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            FileStream fs1 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey2.dat", FileMode.Open, FileAccess.Read);
            string key;
            string str_Public_Key;
            string str_Private_Key;
            fs1.Read(bin, 0, 1000);
            key = System.Text.Encoding.Default.GetString(bin);
            fs1.Close();
            fs1.Dispose();
            RSA.FromXmlString(key);
            str_Public_Key = "";
            str_Private_Key = "";
            str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
            str_Private_Key = Convert.ToBase64String(RSA.ExportCspBlob(true));
            textBox1.Text = str_Public_Key;
            textBox2.Text = str_Private_Key;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            byte[] bin = new byte[1000];
            var cspPas = new CspParameters();
            cspPas.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspPas);
            FileStream fs1 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey1.dat", FileMode.Open, FileAccess.Read);
            string key;
            string str_Public_Key;
            fs1.Read(bin, 0, 1000);
            key = System.Text.Encoding.Default.GetString(bin);
            fs1.Close();
            fs1.Dispose();
            RSA.FromXmlString(key);
            str_Public_Key = "";
            str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
            textBox1.Text = str_Public_Key;
            textBox2.Text = "";        
            byte[] bin1 = new byte[1000];
            var cspPas1 = new CspParameters();
            cspPas1.KeyContainerName = "rsa_key";
            RSACryptoServiceProvider RSA1 = new RSACryptoServiceProvider(cspPas1);
            FileStream fs11 = new FileStream("E:\\学习\\学习\\密码学\\密码学实验\\第三次\\RSATest\\RsaKey2.dat", FileMode.Open, FileAccess.Read);
            string key1;
            string str_Public_Key1;
            string str_Private_Key1;
            fs11.Read(bin1, 0, 1000);
            key1 = System.Text.Encoding.Default.GetString(bin1);
            fs11.Close();
            fs11.Dispose();
            RSA1.FromXmlString(key1);
            str_Private_Key1 = "";
            str_Public_Key1 = Convert.ToBase64String(RSA1.ExportCspBlob(false));
            str_Private_Key1 = Convert.ToBase64String(RSA1.ExportCspBlob(true));            
            textBox2.Text = str_Private_Key1;
        }
    }
}

编辑MFC对话框如下:(添加button控件“读取并显示密钥”)
在这里插入图片描述

七、实验结果

寻找P:
在这里插入图片描述
寻找Q:
在这里插入图片描述
参数计算:
在这里插入图片描述
输入数据进行加解密:
在这里插入图片描述
生成并保存密钥
在这里插入图片描述
保存密钥到文件
在这里插入图片描述

效果如下:
在这里插入图片描述

进行数据加解密:
在这里插入图片描述

在这里插入图片描述

更新密钥:
在这里插入图片描述

读取并显示密钥:
在这里插入图片描述

生成密钥后导入公钥:
在这里插入图片描述

生成密钥后导入密钥对:
在这里插入图片描述

改变最低一位明文的加解密:
在这里插入图片描述

改变最高一位明文的加解密:
在这里插入图片描述

八、实验总结

2.说明素性检测的原理。
答:由于本实验采用的素性检测是Miller-Rabin概率检测法,所以着重叙述此检测法的原理。
对s个不同的a重复调用Miller-Rabin算法,只要有一次算法返回为FALSE,就可肯定n不是素数。如果算法每次返回都为TRUE,则n是素数的概率至少为1-2-S,因此对于足够大的s,就可以非常肯定的相信n为素数。
3.说明RSA参数的e、d计算的原理。
答:利用上题所提到的Miller-Rabin概率检测法,我们寻找p为范围在32768到65535之间的一个大素数,寻找q为范围在8192到16384之间的一个大素数。
令n=pq,fn=(p-1)(q-1),寻找一个范围在128到256之间的一个随机数e,使其与fn互素,最终利用扩展欧基里德算法求e与fn两者的逆元d,即可计算出e、d。
5.分析上述输出的原因,手工验证输出的正确性。
在这里插入图片描述
n=3468710193=353564591
fn=(34687-1)
(10193-1)=353519712
生成随机数e=373与fn=353519712互素
可求得e=373与fn=353519712之间的逆元d=247369021
公钥(353564591,373),私钥(353564591,247369021)
Cd=Mde (mod fn)=3223601373 mod 353564591=7303864
M’d=Cde (mod fn)=7303864373 mod 353564591=3223601
6.描述使用framework编写RSA加解密程序的关键点和要注意的问题。

/// <summary>
        /// RSA 加密
        /// </summary>
        public static string EncryptByRSA(this string source)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(PublicRSAKey);
            var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(source), false);
            return Convert.ToBase64String(cipherbytes);
        }

        /// <summary>
        /// RSA解密
        /// </summary>
        public static string DecryptByRSA(this string source)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(PrivateRSAKey);
            var cipherbytes = rsa.Decrypt(Convert.FromBase64String(source), false);
            return Encoding.UTF8.GetString(cipherbytes);
        }

分段加解密时:如果加密时设置的长度不匹配,可能会报以下错误:
crypto.BadPaddingException : Decryption error //解码失败

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现代密码学第三次实验:不对称加密算法RSA 的相关文章

  • 2、隐私计算--安全多方计算

    目录 安全多方计算 安全多方计算的技术架构 安全挑战敌手模型 安全多方计算关键技术 安全多方计算主要特点 安全多方计算应用 安全多方计算与区块链 JUGO平台 参考 https blog csdn net w365904 article d
  • 在ubuntu环境下执行openssl编译和安装

    参考链接 工具系列 Ubuntu18 04安装Openssl 1 1 1 Tinywan的技术博客 51CTO博客 密码学专题 openssl编译和安装 MY CUP OF TEA的博客 CSDN博客 openssl 编译安装 下载 sou
  • 密码学原语如何应用?解析密码学特有的数据编解码|第10论

    隐私保护方案的工程实现 如何关联到学术论文中天书一般的公式符号 密码学工程中 有哪些特有的数据编解码方式 存在哪些认知误区和注意事项 需要克服哪些限制和挑战 作为支撑隐私保护方案的核心技术 如何运用数据编解码 将密码学论文中抽象的数学符号和
  • RSA简介

    什么是RSA RSA算法是应用最广泛的公钥密码算法 1977年 RSA算法由MIT的罗纳德 李维斯特 Ron Rivest 阿迪 萨莫尔 Adi Shamir 和伦纳德 阿德曼 Leonard Adleman 共同设计 于1978年正式发布
  • 密码学基础(一)——哈希算法

    一 常用密码学算法分类 哈希算法 哈希算法不可逆 包括 MD4 MD5 hash1 ripeMD160 SHA256 SHA3 Keccak256 国家标准SM3 国家密码管理局 加密 解密算法 加密解密算法可逆 但是必须要有秘钥 对称加密
  • kali 破解压缩包密码

    一 提取加密压缩包的哈希值 zip2john 文件名 gt hash txt zip2john 文件名 能提取出文件的哈希值 然后我们通过重定向 将它写入一个文档中 二 利用工具对提取到的哈希值进行破解 john hash txt 然后就能
  • AES加密算法详解(图文解释)

    由于DES加密算法被破解了 3DES加密算法虽然没有被破解 但是3DES算法的加解密效率低 所有现在都使用AES算法 AES加密算法是密码学中的高级加密标准 AES为分组加密法 把明文分成一组一组的 每组长度相等 每次加密一组数据 直到加密
  • 密码学-hash加密

    以下代码分别为乘法hash sha256 md5 ripemd160的使用方法 package main import fmt crypto sha256 os io crypto md5 encoding hex golang org x
  • EIGamal数字签名的实现(c++)——大三密码学实验

    实验原理 1 密钥产生 Alice要对一个消息签名 她选择一个大素数p和一个本原根g 选择一个秘密整数 并且计算 p g y 公开 x秘密保存 注 EIGamal签名方案的安全性在于x的保密性 由于离散对数学问题难解 很难由 p g y 确
  • SM2公钥加密

    文章目录 简介 推荐参数 1 前置条件 1 1 点到字符串的转换 压缩 未压缩 混合形式 1 2 密钥派生函数 6 加解密 加密流程 解密流程 实现 参考资料 简介 国密SM2算法并不仅仅是提供了新的曲线参数 而是在算法上对ECC进行了修改
  • 非对称加密-RSA

    一 非对称加密 1 对称加密 对称密码的核心是一把密钥 使用相同的密钥进行加密和解密 如移位密码 S DES 但密匙本身也是信息 对称密码中它的安全得不到保障 2 非对称加密 非对称密码的核心是公钥和私钥 公钥是用于加密数据的密钥 而私钥则
  • 现代密码学案例研究之索尼PS3破解

    ECDSA案例研究之索尼PS3被破解 背景介绍 ECDSA算法介绍 破解算法介绍 Reference 索尼因为PlayStation 3糟糕的加密实现而受到了黑客的破解 那么事情是怎么样的呢 设计了哪些密码学的算法呢 背景介绍 在2010年
  • 最安全的加密算法

    在密码学里 有一种理想的加密方案 叫做一次一密乱码本 one time pad one time pad的算法有以下要求 1 密钥必须随机产生2 密钥不能重复使用3 密钥和密文的长度是一样的 one time pad是最安全的加密算法 双方
  • 揭秘区块链的核心技术之「哈希与加密算法 」

    大家都知道 区块链的关键技术组成主要为 P2P网络协议 共识机制 密码学技术 账户与存储模型 而这些技术中 又以 密码学与共识机制 这两点为最核心 那么今天我们来详细的聊一聊密码学 看一看密码学技术是如何在区块链中应用的 首先 我们需知道区
  • CTF入门学习笔记——Crypto密码(古典密码)

    文章目录 CTF入门学习笔记 Crypto密码 古典密码 凯撒密码 看我回旋踢 摩斯密码 摩斯 维吉尼亚密码 Vigen re 栅栏密码 篱笆墙的影子 栅栏密码 篱笆墙的影子 猪圈密码 待补充 CTF入门学习笔记 Crypto密码 古典密码
  • 同态加密的原理详解与go实践

    学习资料来源 知乎VenusBlockChain https zhuanlan zhihu com p 110210315 知乎刘巍然 https www zhihu com question 27645858 answer 3759850
  • CTF BugKu平台——Crypto篇刷题记录(后续更新)

    CTF BugKu平台 Crypto篇 前言 抄错的字符 聪明的小羊 ok lt gt 把猪困在猪圈里 你喜欢下棋吗 小山丘的秘密 EN 气泡 你以为是md5吗 Math English easy crypto 黄道十二官 一段新闻 7 1
  • 密码学原语如何应用?解析密文同态性的妙用

    隐私数据在密文形式下是否依旧可以加减乘除 其背后的同态性原理具体指什么 半同态性和全同态性有什么区别 单密钥和多密钥同态加密有哪些奇妙的应用场景 隐私保护方案设计 往往需要在密文状态下 对隐私数据进行特定的业务操作 以此保障数据的机密性 沿
  • 密码学替代密码

    1 请指出一般替代密码的明文空间 密文空间和密钥空间各是什么 明文空间M和密文空间C都是26个英文字母的集合 密钥空间K Z 26 gt Z 26 是置换 是所有可能置换的集合 2 单表替代密码和多表替代密码的主要特点是什么 单表替代密码
  • 有趣的数学 为什么素数在密码学中很重要?

    这里我们将探讨为什么素数在密码学中很重要 我们将根据特定的密码系统 RSA 算法 来进行深入了解 一 素数的特殊性 每个数字都可以分解为它的素数 一般来说 找到一个数的因数是非常困难的 要找到一个自然数的所有素因数 必须尝试将其除以它的可能

随机推荐

  • KEIL5配置astyle

    比较清爽的参数 E style google U p n
  • lighttpd支持AJAX吗,lighttpd

    Lighttpd 是一个德国人领导的开源Web服务器软件 软件名称 lighttpd 软件版本 1 4 49 更新时间 2018 03 11软件语言 英语 简 介 Lighttpd 开源Web服务器软件 操作系统 Linux Windows
  • chrome使用指南

    目录 常用快捷键 常用插件 Octotree github源码浏览 GitCodeTree github gitee源码浏览 Axure RP Extension for Chrome 查看原型图 Tampermonkey 油猴脚本 云盘管
  • Flink CDC问题

    这里会列举出一些关键配置和遇到的问题 一直补充 Oracle CDC 1 SUPPLEMENTAL LOG在库和表上都需要执行 不是只有表上 ALTER TABLE inventory customers ADD SUPPLEMENTAL
  • 原生js触底加载案例

    data return RoomData isBool false limit 0 isLoading false methods roomClick value location href value RoomApi this limit
  • 4.网络配置与系统管理

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chuanqi 支持我 点赞 收藏 留言 愿你我共勉 若身在泥潭 心也在泥潭 则满眼望去均是泥潭 若身在泥潭 而心系鲲鹏 则能见九万里天地 文章目录 网络配置
  • mysql创建表时表明加单引号_python在MySQL表名周围插入单引号(‘)

    我有一个名为project1的数据库 其中包含以下表格 systbl1 systbl2 systbl3 dataset1 dataset2 dataset3 每当添加一个新用户时 都需要授予MySQL用户odbc对dataset 表的SEL
  • 组态王串口服务器虚拟串口,串口服务器USR-N510连接组态王设置步骤

    调试目的 USB RS232或者USB RS485串口线接USR N510串口和电脑USB口 MODBUS SLAVE软件打开COM口 模拟客户串口MODBUS RTU设备 USR N510网线和电脑直连 IP设置同网段 在电脑安装USR
  • unicode编码、字符的转换和得到汉字的区位码

    一 unicode编码 字符的转换截图 二 unicode编码 字符的转换代码 using System using System Collections Generic using System ComponentModel using
  • Visual Studio MFC编程 程序调试时所遇到的问题及解决方法

    本文中记录了笔者在基于Visual Studio MFC编程时 程序调试过程中所遇到的问题及解决方法 目录 1 Visual Studio MFC中的快捷方式 1 1 问题 Visual Studio MFC中修改好程序之后 怎样编译并建立
  • QT实现串口打开和关闭

    一 查找串口 windows 下面这个循环语句用来查找可以用的串口端口 不确定有多少串口可用 也就不知道循环多少次 所以用foreach 不知道用的就百度 foreach const QSerialPortInfo info QSerial
  • Linux常用操作命令

    Shell命令基础 root localhost root 用户名账号 计算机名 用户当前工作目录 文件与目录相关命令 1 ls命令 列出目录内容 执行ls指令可列出目录的内容 包括文件目录以及子目录 ls 参数 文件或目录 若无选定目录
  • 抽象类案例

    卡类 package Java project 1 public abstract class Card private String userName private double money public abstract void p
  • 数据库的连接串(中文)

    在数据库的各种应用程序开发中 连接数据库是数据库应用程序开发的第一步 同时也是最重要的一步 而对于不同的数据库他们的连接模式各有不同 对应的连接串也不同 Sql Server ODBC o 标准连接 Standard Security Dr
  • CSS之background-position属性

    1 作用 background position是用来控制元素背景图片的位置 以图片的左上角顶点为原点 属性值为正就代表图片下移或右移 属性值为负就代表图片上移或左移 它接受三种值 关键词 比如top right bottom left和c
  • WordPress:实现发布文章自动添加TAG标签

    在给我们的WordPress博客更新文章时 大多数人应该会给文章添加一些TAG标签 文章添加TAG标签也是我们做WordPress优化必不可少的一项 但是如果每一篇文章的关键字标签都要手动添加链接 那也太麻烦了 今天给大家分享一篇自动给文章
  • java---多重循环练习

    java 多重循环练习 1 关于多重循环的嵌套使用 举例 一 循环嵌套的用法 1 更加方便 重复率低的实现多步操作 二 使用步骤 1 多个循环结构嵌套 代码如下 示例 for 变量初始值 循环条件 迭代 for 变量初始值 循环条件 迭代
  • RabbitMQ 中arguments详解(系列一之Message TTL)

    注 以下程序使用C 实现 在我们使用RabbitMQ声明队列时 其中最后一个参数是arguments 那么arguments到底有什么用呢 下面我们解释其中参数的第一中用法 即 消息过期时间 Message TTL 我们将最后一个参数arg
  • OW-DETR

    欢迎关注我的公众号 极智视界 获取我的更多笔记分享 大家好 我是极智视界 本文解读一下 基于 Transformer 的开放世界目标检测器 OW DETR 开放世界目标检测 OWOD 是一个具有挑战性的计算机视觉问题 其任务是检测一组已知的
  • 现代密码学第三次实验:不对称加密算法RSA

    现代密码学第三次实验 不对称加密算法RSA 前言 一 实验目的 二 实验环境 三 实验步骤 四 实验基本方法 五 实验程序清单 七 实验结果 八 实验总结 前言 为了帮助同学们完成痛苦的实验课程设计 本作者将其作出的实验结果及代码贴至CSD