當前位置:首頁 » 操作系統 » 演算法chr

演算法chr

發布時間: 2023-04-07 11:00:55

A. vbs加密演算法問題

將asc轉換為十六進制即可,位數統一,還可以忽略負號。

FunctionGenerateCode(strText)
'輸入字元串(strText),返回十六進制ANSI編碼
Dimi
Fori=1toLen(strText)
GenerateCode=GenerateCode&Hex(Asc(Mid(strText,i,1)))
Next
EndFunction

FunctionGetText(strCode)
'輸入十六進制ANSI編碼(strCode),返回字元串原文
Dimi,strTmp
Fori=1toLen(strCode)Step2
strTmp="&h"&Mid(strCode,i,2)
IfCInt(strTmp)<128Then
GetText=GetText&Chr(strTmp)
Else
i=i+2
GetText=GetText&Chr(strTmp&Mid(strCode,i,2))
EndIf
Next
EndFunction

這是我自己加密字元串用的。符合你的要求,密文為十六進制無分隔符的連續字元串,ASCII字元(0-127)轉換為2位,其它ANSI字元(256-65535)轉換為4位。

此演算法是本著平衡 [加密/解密的代碼量] 與 [密文長度] 為宗旨編寫的。


不知道你加密想要干什麼,但我還是建議你:

  1. 不要想著進一步通過運算等方式「加密」,因為在vbs下解密演算法是明文,一切加密在懂行者看來都是沒意義的。在我看來,vbs的加密充其量也就是稍微隱藏下字元串或代碼,不被人一眼就看到意圖而已。所以說,我這個演算法就夠用了。

  2. 如果想進一步隱藏代碼,可以自己網路[ Scripting.Encoder ]。不出意外的,這個也可以被解密。


代碼中有不懂的地方可以追問。

B. RSA演算法的C++實現

RSA演算法介紹及java實現,其實java和c++差不多,參考一下吧

<一>基礎

RSA演算法非常簡單,概述如下:
找兩素數p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一個數e,要求滿足e<t並且e與t互素(就是最大公因數為1)
取d*e%t==1

這樣最終得到三個數: n d e

設消息為數M (M <n)
設c=(M**d)%n就得到了加密後的消息c
設m=(c**e)%n則 m == M,從而完成對c的解密。
註:**表示次方,上面兩式中的d和e可以互換。

在對稱加密中:
n d兩個數構成公鑰,可以告訴別人;
n e兩個數構成私鑰,e自己保留,不讓任何人知道。
給別人發送的信息使用e加密,只要別人能用d解開就證明信息是由你發送的,構成了簽名機制。
別人給你發送信息時使用d加密,這樣只有擁有e的你能夠對其解密。

rsa的安全性在於對於一個大數n,沒有有效的方法能夠將其分解
從而在已知n d的情況下無法獲得e;同樣在已知n e的情況下無法
求得d。

<二>實踐

接下來我們來一個實踐,看看實際的操作:
找兩個素數:
p=47
q=59
這樣
n=p*q=2773
t=(p-1)*(q-1)=2668
取e=63,滿足e<t並且e和t互素
用perl簡單窮舉可以獲得滿主 e*d%t ==1的數d:
C:\Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"
847
即d=847

最終我們獲得關鍵的
n=2773
d=847
e=63

取消息M=244我們看看

加密:

c=M**d%n = 244**847%2773
用perl的大數計算來算一下:
C:\Temp>perl -Mbigint -e "print 244**847%2773"
465
即用d對M加密後獲得加密信息c=465

解密:

我們可以用e來對加密後的c進行解密,還原M:
m=c**e%n=465**63%2773 :
C:\Temp>perl -Mbigint -e "print 465**63%2773"
244
即用e對c解密後獲得m=244 , 該值和原始信息M相等。

<三>字元串加密

把上面的過程集成一下我們就能實現一個對字元串加密解密的示例了。
每次取字元串中的一個字元的ascii值作為M進行計算,其輸出為加密後16進制
的數的字元串形式,按3位元組表示,如01F

代碼如下:

#!/usr/bin/perl -w
#RSA 計算過程學習程序編寫的測試程序
#watercloud 2003-8-12
#
use strict;
use Math::BigInt;

my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59

my $N=new Math::BigInt($RSA_CORE{n});
my $E=new Math::BigInt($RSA_CORE{e});
my $D=new Math::BigInt($RSA_CORE{d});

print "N=$N D=$D E=$E\n";

sub RSA_ENCRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$cmess);

for($i=0;$i < length($$r_mess);$i++)
{
$c=ord(substr($$r_mess,$i,1));
$M=Math::BigInt->new($c);
$C=$M->(); $C->bmodpow($D,$N);
$c=sprintf "%03X",$C;
$cmess.=$c;
}
return \$cmess;
}

sub RSA_DECRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$dmess);

for($i=0;$i < length($$r_mess);$i+=3)
{
$c=substr($$r_mess,$i,3);
$c=hex($c);
$M=Math::BigInt->new($c);
$C=$M->(); $C->bmodpow($E,$N);
$c=chr($C);
$dmess.=$c;
}
return \$dmess;
}

my $mess="RSA 娃哈哈哈~~~";
$mess=$ARGV[0] if @ARGV >= 1;
print "原始串:",$mess,"\n";

my $r_cmess = RSA_ENCRYPT(\$mess);
print "加密串:",$$r_cmess,"\n";

my $r_dmess = RSA_DECRYPT($r_cmess);
print "解密串:",$$r_dmess,"\n";

#EOF

測試一下:
C:\Temp>perl rsa-test.pl
N=2773 D=847 E=63
原始串:RSA 娃哈哈哈~~~
加密串:
解密串:RSA 娃哈哈哈~~~

C:\Temp>perl rsa-test.pl 安全焦點(xfocus)
N=2773 D=847 E=63
原始串:安全焦點(xfocus)
加密串:
解密串:安全焦點(xfocus)

<四>提高

前面已經提到,rsa的安全來源於n足夠大,我們測試中使用的n是非常小的,根本不能保障安全性,
我們可以通過RSAKit、RSATool之類的工具獲得足夠大的N 及D E。
通過工具,我們獲得1024位的N及D E來測試一下:

n=EC3A85F5005D
4C2013433B383B
A50E114705D7E2
BC511951

d=0x10001

e=DD28C523C2995
47B77324E66AFF2
789BD782A592D2B
1965

設原始信息
M=

完成這么大數字的計算依賴於大數運算庫,用perl來運算非常簡單:

A) 用d對M進行加密如下:
c=M**d%n :
C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233
333333333, 0x10001,
D55EDBC4F0
6E37108DD6
);print $x->as_hex"
b73d2576bd
47715caa6b
d59ea89b91
f1834580c3f6d90898

即用d對M加密後信息為:
c=b73d2576bd
47715caa6b
d59ea89b91
f1834580c3f6d90898

B) 用e對c進行解密如下:

m=c**e%n :
C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab
5aa1d99ef3
0cb4764414
, 0xE760A
3C29954C5D
7324E66AFF
2789BD782A
592D2B1965, CD15F90
4F017F9CCF
DD60438941
);print $x->as_hex"

(我的P4 1.6G的機器上計算了約5秒鍾)

得到用e解密後的m= == M

C) RSA通常的實現
RSA簡潔幽雅,但計算速度比較慢,通常加密中並不是直接使用RSA 來對所有的信息進行加密,
最常見的情況是隨機產生一個對稱加密的密鑰,然後使用對稱加密演算法對信息加密,之後用
RSA對剛才的加密密鑰進行加密。

最後需要說明的是,當前小於1024位的N已經被證明是不安全的
自己使用中不要使用小於1024位的RSA,最好使用2048位的。

----------------------------------------------------------

一個簡單的RSA演算法實現JAVA源代碼:

filename:RSA.java

/*
* Created on Mar 3, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/

import java.math.BigInteger;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;

/**
* @author Steve
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class RSA {

/**
* BigInteger.ZERO
*/
private static final BigInteger ZERO = BigInteger.ZERO;

/**
* BigInteger.ONE
*/
private static final BigInteger ONE = BigInteger.ONE;

/**
* Pseudo BigInteger.TWO
*/
private static final BigInteger TWO = new BigInteger("2");

private BigInteger myKey;

private BigInteger myMod;

private int blockSize;

public RSA (BigInteger key, BigInteger n, int b) {
myKey = key;
myMod = n;
blockSize = b;
}

public void encodeFile (String filename) {
byte[] bytes = new byte[blockSize / 8 + 1];
byte[] temp;
int tempLen;
InputStream is = null;
FileWriter writer = null;
try {
is = new FileInputStream(filename);
writer = new FileWriter(filename + ".enc");
}
catch (FileNotFoundException e1){
System.out.println("File not found: " + filename);
}
catch (IOException e1){
System.out.println("File not found: " + filename + ".enc");
}

/**
* Write encoded message to 'filename'.enc
*/
try {
while ((tempLen = is.read(bytes, 1, blockSize / 8)) > 0) {
for (int i = tempLen + 1; i < bytes.length; ++i) {
bytes[i] = 0;
}
writer.write(encodeDecode(new BigInteger(bytes)) + " ");
}
}
catch (IOException e1) {
System.out

C. 加密演算法518867對應0,518866對應1,518873對應10,請問這是什麼演算法

對於大部分密碼加密,我們可以採用md5、sha1等方法。可以有效防止數據泄露,但是這些方法僅適用於無需還原的數據加密。對於需要還原的信息,則需要採用可逆的加密解密演算法,下面一組php函數是實現此加密解密的方法
加密演算法如下: 代碼如下: function encrypt($data, $key) { $key = md5($key); $x = 0; $len = strlen($data); $l = strlen($key); for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= $key{$x}; $x++; } for ($i = 0; $i < $len; $i++) { $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); } return base64_encode($str); } 解密演算法如下: 代碼如下: function decrypt($data, $key) { $key = md5($key); $x = 0; $data = base64_decode($data); $len = strlen($data); $l = strlen($key); for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= substr($key, $x, 1); $x++; } for ($i = 0; $i < $len; $i++) { if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) { $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); } else { $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); } } return $str; } 上述加密解密的過程均需要用到一個加密密鑰(即參數$key)。 代碼如下: $data = 'PHP加密解密演算法'; // 被加密信息 $key = '123'; // 密鑰 $encrypt = encrypt($data, $key); $decrypt = decrypt($encrypt, $key); echo $encrypt, "n", $decrypt; 上述將輸出類似如下結果: 代碼如下: gniCSOzZG+HnS9zcFea7SefNGhXF PHP加密解密演算法 從上述結果可以看出,這是一組可逆的加密解密演算法,可以用於部分需要還原的數據加密。

D. 什麼叫多字母加密

多字母順序加密的這種演算法的每個字母的後推位次並不相同,假如D代替了A ,並不一定是E取代B。在第二次世界大戰中名聲大震的Enigma自動加密機,也基於這個原理工作。
相對而言:
羅馬的將軍們用字母後推3位的方法加密往來的信函。比如,用D來代替A,E代替B,以此類推。這個單一字母順序加密法,直到九世紀才被阿拉伯的學者通過不斷的分析破解。

http://www.chip.cn/index.php?option=com_content&view=article&id=3040:2010-09-01-07-23-41&catid=5:news-remarks&Itemid=13

時間之旅:天書奇譚-加密篇

導言:每個人都在問這個問題:你能保密碼?2500年來,統治者、保密機構和密碼破譯家一直尋找著答案。

一直以來,加密技術都應用於政治領域。現如今,每個人在網上沖浪、收發email或者使用網上銀行的時候,都要用到加密演算法。加密能避免「竊聽」事件的發生,如果沒有加密演算法,互聯網或許不會是今天這個樣子。

現代數據加密演算法的原理仍基於羅馬帝國的凱撒與他的將軍們聯系所使用的加密方法,它的原理基於凱撒時代的字母表。羅馬的將軍們用字母後推3位的方法加密往來的信函。比如,用D來代替A,E代替B,以此類推。這個單一字母順序加密法,直到九世紀才被阿拉伯的學者通過不斷的分析破解。然而,法國人Blaise de Vigenère的多字母順序加密就不那麼容易破解了,這種演算法的每個字母的後推位次並不相同,假如D代替了A ,並不一定是E取代B。在第二次世界大戰中名聲大震的Enigma自動加密機,也基於這個原理工作。

計算機時代的到來,使得這一切都發生了改變。伴隨著不斷上升的處理能力,演算法變得越來越復雜,「攻擊」也變得越來越高效。此後,密碼破譯家便遵循Kerckhoffs原則,一個密碼系統應該是安全的,即使該系統的一切,除了密鑰,都可以作為公共知識。這種「開源」理念的好處是,任何人都可以試驗這種加密演算法的優劣。

用於科學研究目的的攻擊是可取的。如果攻擊是成功的,一個更好的演算法便有了用武之地。在1998年,數據加密標准(DES)的命運便是如此,它曾是美國當局首選的加密方法。密鑰的長度只有短短的56位,如果使用強力攻擊,很快便可破解。

DES 的繼任者從競爭中勝出,Rijndael演算法贏得了最後的勝利。美國國家標准技術研究所(NIST)選擇Rijndael作為美國政府加密標准(AES)的加密演算法,該演算法使用128位密鑰,適用WLAN,能夠勝任藍光加密。然而,這么經典的對稱演算法對於網路通訊還是不夠安全。發送者和接收者使用相同的密鑰加密和解密。任何人都可以截獲密鑰,因為它並未加密。

發明於上世紀70年代的非對稱加密法幫助解決了這個問題。接收者生成公共密鑰和私人密鑰兩個部分,他將公共密鑰發送給那些需要向他發送加密信息的人。公共密鑰可以加密文件,但是這些文件需要私人密鑰才能解碼。這一演算法的缺點是:密鑰對需要兩組大的原始數字生成,非常耗時。對網路銀行等個人業務,對稱法和非對稱法組合使用的方法是有效的。信息部分使用對稱法加密,但密鑰應採用非對稱法加密。

當量子電腦有足夠的能力使用強力攻擊破解128位的密鑰的時候,非對稱加密法就不安全了。量子密碼學利用物理學原理保護信息,以量子為信息載體,經由量子信道傳送,在合法用戶之間建立共享的密鑰,它的安全性由「海森堡測不準原理」及「單量子不可復制定理」保證。
加密史

400v.Chr. Skytale(天書)
時間之旅:天書奇譚-加密篇

Skytale 就是一種加密用的、具有一定粗細的棍棒或權杖。斯巴達人把重要的信息纏繞在Skytale上的皮革或羊皮紙之後,再把皮革或羊皮紙解下來,這樣就能有效地打亂字母順序。只有把皮(紙)帶再一點點卷回與原來加密的Skytale同樣粗細的棍棒上後,文字信息逐圈並列在棍棒的表面,才能還原出本來的意思。

50v.Chr. 凱撒密碼
時間之旅:天書奇譚-加密篇

羅馬的統治者將字母後推3個位次加密,這就是今天廣為人知的單一字母加密法。

1360 Alphabetum Kaldeorum
時間之旅:天書奇譚-加密篇

奧地利的Rudolf 四世發明了中世紀最受歡迎的加密法,他甚至在墓碑上也使用它。

1467 加密碟
時間之旅:天書奇譚-加密篇

這個工具使得單一字母加密法的字母取代簡單化。

1585 維熱納爾密碼(Vigenère)

法國外交家Blaise de Vigenère發明了一種方法來對同一條信息中的不同字母用不同的密碼進行加密,這種多字母加密法在誕生後300年內都沒能被破解。

1854 Charles Babbage
時間之旅:天書奇譚-加密篇

計算機的發明者,據說是他第一個破解了維熱納爾代碼,人們在檢查他的遺物時發現了這一破解方法。

1881 Kerkhoff原則
時間之旅:天書奇譚-加密篇

這以後,加密演算法的安全性不再取決於演算法的保密,而是密鑰的保密。

1918 Enigma和一次性密鑰
時間之旅:天書奇譚-加密篇

Enigma是著名的德國加密機,為每個字母生成取代位次。在很長的一段時間內,都被認為是無法破解的。

一次性密鑰在數學上是安全的:使用編碼手冊,為每個文本使用不用的加密方式——在冷戰時期,間諜常使用此工具。

1940 Tuning-Bombe
時間之旅:天書奇譚-加密篇

這個機器由Alan Turking 發明,用於破解Enigma加密機。它包含了多個相互配合使用的Enigma設備。

1965 Fialka
時間之旅:天書奇譚-加密篇

東歐的「Enigma」,一直使用到柏林牆倒塌。自1967起被為認為不再安全。

1973 公共密鑰

英國智囊機構的3個軍官首先開發了非對稱加密。直到1997年才被揭秘。

1976 DES
時間之旅:天書奇譚-加密篇

IBM與NASA合作,為美國官方開發了數據加密標准。然而,評論家發現了將密鑰長度從128位降低到56位這一該演算法的瑕疵。

1977 RSA
時間之旅:天書奇譚-加密篇

Rivest、Shamir 和Adelman三人發明了可靠的非對稱加密法。目前,它主要用於郵件加密和數字簽名等場合。

1998 深度破解
時間之旅:天書奇譚-加密篇

電子國界基金會有一台擁有1800個處理器的計算機,它通過蠻力破解了DES加密法。

2000 AES
時間之旅:天書奇譚-加密篇

DES的繼任者,Rijndael演算法在公開競爭中取勝。高級加密標準是最為廣泛應用的對稱加密手段。

2008 量子密碼網路 DES

使用量子密碼保護的光纖網路在維也納首次展示。

2030未來趨勢:量子計算機
時間之旅:天書奇譚-加密篇

量子計算機工作如此之快,能夠破解先前的所有加密演算法。只有量子密碼學才能保護信息免於被破解。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:741
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372