數字簽名與身份認證: RSA演算法指北
簡介
RSA algorithm
是一種非對稱加密
演算法,解密需要兩個不同的金鑰,public key
和private key
。一個典型的非對稱加密流程是:
- 客戶端向服務端傳送
public key
並請求資料 - 服務端使用
public key
加密資料並響應請求 - 客戶端接收到資料後使用
private key
解密
RSA演算法的核心思想
大數分解因子操作的高複雜度能有效保證RSA algorithm
的安全性。public key
由兩個陣列成,其中一個數為兩個大質數的乘積;private key
由這兩個大質數產生。實際上只要能對公鑰中的數進行因子分解,就能破解對應的私鑰。RSA演算法的安全性隨key length
RSA演算法的實現機制
工作機制:
- 選擇兩個質數 and
- 計算整個加密解密運算的模
- 計算的尤拉函式
- 選擇公鑰加密所需的冪指數
- 計算私鑰解密所需的冪指數 ,其中為選定常數
- 加密時對數字資訊執行 獲得加密資訊
- 解密時對加密資訊執行 獲得原資訊
實現程式碼如下:
#include<stdio.h>
#include<math.h>
int gcd(int a, int h)
{
int temp;
while (1)
{
temp = a%h;
if (temp == 0)
return h;
a = h;
h = temp;
}
}
int main()
{
double p = 3;
double q = 7;
double n = p*q;
double e = 2;
double phi = (p-1)*(q-1);
while (e < phi)
{
if (gcd(e, phi)==1)
break;
else
e++;
}
int k = 2;
double d = (1 + k*phi)/e;
double msg = 20;
printf("Message data = %lf", msg);
double c = pow(msg, e);
c = fmod(c, n);
printf("\nEncrypted data = %lf", c);
double m = pow(c, d);
m = fmod(m, n);
printf("\nOriginal Message Sent = %lf", m);
}
執行結果:
Message data = 20.000000
Encrypted data = 20.000000
Original Message Sent = 20.000000
RSA加密解密的合法性
- 前提:
- 結論:
- 定理:
- 尤拉定理:
- 對於互質的正整數和,有
- 同餘運算:
- 若 則
- 另一個推論:
- 若 , 則
- 尤拉定理:
- 證明:
- 時:
- 根據尤拉定理和同餘運演算法則易證
- 時:
- 只需證得
- 假設 , 則
- 得證
- 時:
RSA演算法的實用實現與相關優化
程式碼如下:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;//RSA演算法所需引數
typedef struct RSA_PARAM_Tag
{
unsigned __int64 p, q; //兩個素數,不參與加密解密運算
unsigned __int64 f; //f=(p-1)*(q-1),不參與加密解密運算
unsigned __int64 n, e; //公匙,n=p*q,gcd(e,f)=1
unsigned __int64 d; //私匙,e*d=1 (mod f),gcd(n,d)=1
unsigned __int64 s; //塊長,滿足^s<=n的最大的s,即log2(n)
} RSA_PARAM;
//小素數表
const static long g_PrimeTable[] =
{ 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };
const static long g_PrimeCount = sizeof(g_PrimeTable) / sizeof(long);
const unsigned __int64 multiplier = 12747293821;
const unsigned __int64 adder = 1343545677842234541;
//隨機數類
class RandNumber
{
private:
unsigned __int64 randSeed;
public:
RandNumber(unsigned __int64 s = 0);
unsigned __int64 Random(unsigned __int64 n);
};
RandNumber::RandNumber(unsigned __int64 s)
{
if (!s)
randSeed = (unsigned __int64)time(NULL);
else
randSeed = s;
}
unsigned __int64 RandNumber::Random(unsigned __int64 n)
{
randSeed = multiplier * randSeed + adder;
return randSeed % n;
}
static RandNumber g_Rnd;
/* 模乘運算,返回值x=a*b mod n */
inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n)
{
return a * b % n;
}
/* 模冪運算,返回值x=base^pow mod n */
unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n)
{
unsigned __int64 a = base, b = pow, c = 1;
while (b)
{
while (!(b & 1))
{
b >>= 1; //a=a * a % n;
//函式看起來可以處理位的整數,但由於這裡a*a在a>=2^32時已經造成了溢位,因此實際處理範圍沒有位
a = MulMod(a, a, n);
}
b--;
//c=a * c % n;
//這裡也會溢位,若把位整數拆為兩個位整數不知是否可以解決這個問題。
c = MulMod(a, c, n);
}
return c;
}
/* Rabin-Miller素數測試,通過測試返回,否則返回。n是待測素數。
注意:通過測試並不一定就是素數,非素數通過測試的概率是1/4 */
long RabinMillerKnl(unsigned __int64 &n)
{
unsigned __int64 b, m, j, v, i;
m = n - 1;
j = 0;
//0、先計算出m、j,使得n-1=m*2^j,其中m是正奇數,j是非負整數
while (!(m & 1))
{
++j;
m >>= 1;
}
//1、隨機取一個b,<=b<n-1
b = 2 + g_Rnd.Random(n - 3);
//2、計算v=b^m mod n
v = PowMod(b, m, n);
//3、如果v==1,通過測試
if (v == 1)
{
return 1;
}
//4、令i=1
i = 1;
b =
相關推薦
數字簽名與身份認證: RSA演算法指北
簡介
RSA algorithm是一種非對稱加密演算法,解密需要兩個不同的金鑰,public key和private key。一個典型的非對稱加密流程是:
客戶端向服務端傳送public key並請求資料
服務端使用public key加密資料並響應請求
客戶
數字簽名在身份認證中的作用
問題一 http協議是無狀態的,那麼大多數網站是如何記住使用者身份的?問題二 類似於第一個問題,但又略微有些不同,基於http協議的app應用又是如何記錄使用者身份的?問題三 如何保持自動登入狀態?其實,做過相關開發的同學很快就能說出很多,你們說的都對。問題一,通過session和co
數字證書與身份認證攻防
vat -- 證書頒發機構 篡改 證書認證 客戶 攻擊 第一步 沒有 數字證書是一個電子文檔,其中包含了持有者的信息、公鑰以及證明該證書有效的數字簽名。
證書簽名與驗簽:
簽名: 上級證書擁有者,搜集到下級證書申請信息後,將整體信息使用私鑰簽名;
驗簽: 使用上
安全體系(零)—— 加解密演算法、訊息摘要、訊息認證技術、數字簽名與公鑰證書
鋒影
email:[email protected]
如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少隨意
本文講解對稱加密、非對稱加密、訊息摘要、MAC、數字簽名、公鑰證書的用途、不足和解決的問題。
0.概
【React全家桶入門之十】登錄與身份認證
cto json head AC push 操作 undefine 防盜 項目依賴
細致想想。我們的後臺系統還沒有一個登錄功能,太不靠譜,趕緊把防盜門安上!
SPA
JAR包數字簽名與驗證
經簽名的Jar包內包含了以下內容:
原Jar包內的class檔案和資原始檔
簽名檔案 META-INF/*.SF:這是一個文字檔案,包含原Jar包內的class檔案和資原始檔的Hash
簽名block檔案 META-INF/*.DSA:這是一個數據檔案,包含簽名者的 c
GnuPG數字簽名與驗證應用
先準備好要簽名的檔案。
[[email protected] gnupg-2.1.4]# cat message.txt
hello
gpg
一 數字簽名一個檔案的方法A
1 使用如下命令對message.txt進行數字簽名
[[email pro
公鑰密碼學_數字簽名和訊息認證的區別
在公鑰密碼學不足的問題在於怎麼讓接收方確定訊息的傳送者是誰,以及傳送的訊息是否被攻擊者篡改過,解決這兩個問題就可以讓公鑰加密變得完善
訊息認證
訊息認證就是確定接收者接收到的訊息是否真實,例如有沒有被改動過啊,訊息認證又叫完整性校驗,在我們通訊OSI安全模型中稱
http相關的session及cookie的工作原理與身份認證
型別選原創是有點慚愧
其實是我看了這篇文章的總結:http://blog.csdn.net/kgd1120/article/details/2159458
寫得很好,就是略長,後面java的httpsession我就沒看了
正題:
經常上98什麼的時候,發現只要不點退出,
數字簽名與數字證書
前言
先看一下百度百科對數字簽名和數字證書的解釋:
數字簽名:
將報文按雙方約定的HASH演算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。
將該報文摘要值用傳送者的私人
【React全家桶入門之十】登入與身份認證
仔細想想,我們的後臺系統還沒有一個登入功能,太不靠譜,趕緊把防盜門安上!
SPA的鑑權方式和傳統的web應用不同:由於頁面的渲染不再依賴服務端,與服務端的互動都通過介面來完成,而REASTful風格的介面提倡無狀態(state less),通常不使用cooki
數字簽名與數字證書形象解釋
前言
先看一下百度百科對數字簽名和數字證書的解釋:
數字簽名:
將報文按雙方約定的HASH演算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。
將該報文摘要值用傳送者
數字簽名與數字證書的原理
在瞭解數字簽名和數字證書之前,可以先了解一下加密演算法的一些常見分類,我之前寫了一篇介紹常見加密演算法的文章。https://www.cnblogs.com/mysticbinary/p/12615063.html
# 將軍與士兵通訊 ---- 數字簽名原理
為了用最簡單的方式來講解數字簽名,我下面
網絡安全與管理精講視頻筆記4-數字信封、數字簽名、完整性驗證、數據加解密及身份認證流程
工具 發送 認證 ems str 結合 一個 驗證 過程 第二章 ?數字信封、數字簽名、完整性驗證、數據加解密及身份認證流程
數字信封:將對稱加密技術和非對稱加密技術結合使用的過程。數字簽名:驗證發送方的身份,發送方用自己的私鑰簽名,接收方用發送方的公鑰驗證。完整性驗證:H
加密,認證疑難名詞總結----RSA, 公鑰,私鑰,CA,數字簽名,數字證書
成功 digital 出現 直觀 證明 col 文件簽名 nat blog 在網絡和操作系統安全通信中經常涉及到這幾個名詞: RSA, 公鑰,私鑰,CA,數字簽名,數字證書。我找了很多資料,很少有把疑難點講全面的。但不講清楚這幾個,很難有一個清晰的認識和理解。我現在也嘗試這
雜湊演算法與加密通訊、數字簽名
作為通訊工程的學生,我在學習《資訊理論與編碼》這門課的時候瞭解過關於加密解密的一些知識,但覺得不夠深入,不甚過癮。
這幾天學習了跟密碼學有很大關聯的雜湊演算法,跟大家分享一下。
雜湊演算法是什麼
雜湊,英文為Hash,有時翻譯為雜湊,所以雜湊
SM2演算法第二十五篇:ECDSA數字簽名演算法原理與實現
---------------------------------------------轉載原因-------------------------------------------------
這邊部落格中有關
EC_KEY_set_private_key和EC_KEY_set_public_key
數字簽名加密演算法(RSA、DSA、ECDSA)
RSA的例子:
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.securi
Java 數字簽名演算法RSA 的使用教程
JAVA
20小時前 36瀏覽
0評論
最近用到了
RSA 演算法,百度了一下,發現很多文章都是互相轉載的。有的實現太過複雜,有的完全沒有中心,是錯誤的實現。今天小編就特意為大家整理了一下
java 使用 RSA 演算法的案例,希望能對大家有所幫助!
關於 RSA
Android簽名與認證詳細分析之一(CERT.RSA剖析)
一、Android簽名概述
我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。
給定一個Apk檔案,解壓,可以看到一個META