当前位置:首页 » 操作系统 » 算法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