「java密码学算法」密码法算法

博主:adminadmin 2023-01-04 13:51:09 874

今天给各位分享java密码学算法的知识,其中也会对密码法算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java的 DES 加密解密方法 求对应C#的加密解密方法,急切

/*

* @param arrB 需要转换的byte数组

* @return 转换后的字符串

* @throws Exception 本方法不处理任何异常,所有异常全部抛出

*/

public static String byteArr2HexStr(byte[] arrB) throws Exception {

int iLen = arrB.length;

// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍

StringBuffer sb = new StringBuffer(iLen * 2);

for (int i = 0; i iLen; i++) {

int intTmp = arrB[i];

// 把负数转换为正数

while (intTmp 0) {

intTmp = intTmp + 256;

}

// 小于0F的数需要在前面补0

if (intTmp 16) {

sb.append("0");

}

sb.append(Integer.toString(intTmp, 16));

}

return sb.toString();

}

/*

* @param strIn 需要转换的字符串

* @return 转换后的byte数组

* @throws Exception 本方法不处理任何异常,所有异常全部抛出

*/

public static byte[] hexStr2ByteArr(String strIn) throws Exception {

byte[] arrB = strIn.getBytes();

int iLen = arrB.length;

// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2

byte[] arrOut = new byte[iLen / 2];

for (int i = 0; i iLen; i = i + 2) {

String strTmp = new String(arrB, i, 2);

arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);

}

return arrOut;

}

/**

* 加密字节数组

*

* @param arrB

* 需加密的字节数组

* @return 加密后的字节数组

* @throws Exception

*/

@SuppressWarnings("restriction")

private static byte[] encrypt(byte[] arrB,String keyParameter) throws Exception {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

Key key = getKey(keyParameter.getBytes());

Cipher encryptCipher = Cipher.getInstance("DES");

encryptCipher.init(Cipher.ENCRYPT_MODE, key);

return encryptCipher.doFinal(arrB);

}

/**

* 加密字符串

*

* @param strIn

* 需加密的字符串

* @return 加密后的字符串

* @throws Exception

*/

public static String encrypt(String strIn,String keyParameter) throws Exception {

return HexStrByteArrUtils.byteArr2HexStr(encrypt(strIn.getBytes(PiccConfig.PICC_INPUT_CHARSET),keyParameter));

}

/**

* 解密字节数组

*

* @param arrB

* 需解密的字节数组

* @return 解密后的字节数组

* @throws Exception

*/

@SuppressWarnings("restriction")

private static byte[] decrypt(byte[] arrB,String keyParameter) throws Exception {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

Key key = getKey(keyParameter.getBytes());

Cipher decryptCipher = Cipher.getInstance("DES");

decryptCipher.init(Cipher.DECRYPT_MODE, key);

return decryptCipher.doFinal(arrB);

}

/**

* 解密字符串

*

* @param strIn

* 需解密的字符串

* @return 解密后的字符串

* @throws Exception

*/

public static String decrypt(String strIn,String keyParameter) throws Exception {

return new String(decrypt(HexStrByteArrUtils.hexStr2ByteArr(strIn),keyParameter),PiccConfig.PICC_INPUT_CHARSET);

}

用Java实现IDEA数据加密解密

随着Internet的迅速发展,电子商务的浪潮势不可挡,日常工作和数据传输都放在Internet网上进行传输,大大提高了效率,降低了成本,创造了良好的效益。但是,由于Internet网络协议本身存在着重要的安全问题(IP包本身并不继承任何安全特性,很容易伪造出IP包的地址、修改其内容、重播以前的包以及在传输途中拦截并查看包的内容),使网上的信息传输存在巨大的安全风险电子商务的安全问题也越来越突出。加密是电子商务中最主要的安全技术,加密方法的选取直接影响电子商务活动中信息的安全程度,在电子商务系统中,主要的安全问题都可以通过加密来解决。数据的保密性可通过不同的加密算法对数据加密来实现。

对我国来讲,虽然可以引进很多的外国设备,但加密设备不能依靠引进,因为它涉及到网络安全、国家机密信息的安全,所以必须自己研制。当前国际上有许多加密算法,其中DES(Data Encryption Standard)是发明最早的用得最广泛的分组对称加密算法,DES用56位蜜钥加密64位明文,输出64位密文,DES的56位密钥共有256 种可能的密钥,但历史上曾利用穷举攻击破解过DES密钥,1998年电子边境基金会(EFF)用25万美元制造的专用计算机,用56小时破解了DES的密钥,1999年,EFF用22小时完成了破解工作,使DES算法受到了严重打击,使它的安全性受到严重威胁。因为JAVA语言的安全性和网络处理能力较强,本文主要介绍使用IDEA(Internation Data Encryption Algorithm )数据加密算法在Java环境下实现数据的安全传输。

一、IDEA数据加密算法

IDEA数据加密算法是由中国学者来学嘉博士和著名的密码专家 James L. Massey 于1990年联合提出的。它的明文和密文都是64比特,但密钥长为128比特。IDEA 是作为迭代的分组密码实现的,使用 128 位的密钥和 8 个循环。这比 DES 提供了更多的 安全性,但是在选择用于 IDEA 的密钥时,应该排除那些称为“弱密钥”的密钥。DES 只有四个弱密钥和 12 个次弱密钥,而 IDEA 中的弱密钥数相当可观,有 2 的 51 次方个。但是,如果密钥的总数非常大,达到 2 的 128 次方个,那么仍有 2 的 77 次方个密钥可供选择。IDEA 被认为是极为安全的。使用 128 位的密钥,蛮力攻击中需要进行的测试次数与 DES 相比会明显增大,甚至允许对弱密钥测试。而且,它本身 也显示了它尤其能抵抗专业形式的分析性攻击。

二、Java密码体系和Java密码扩展

Java是Sun公司开发的一种面向对象的编程语言,并且由于它的平台无关性被大量应用于Internet的开发。Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factory方法来创建类的例程,然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在Java中实现数据的加密/解密,是使用其内置的JCE(Java加密扩展)来实现的。Java开发工具集1.1为实现包括数字签名和信息摘要在内的加密功能,推出了一种基于供应商的新型灵活应用编程接口。Java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。Java密码学结构设计遵循两个原则:(1)算法的独立性和可靠性。(2)实现的独立性和相互作用性。算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时,提供一个缺省的提供器Sun。

三、Java环境下的实现

1.加密过程的实现

void idea_enc( int data11[], /*待加密的64位数据首地址*/ int key1[]){

int i ;

int tmp,x;

int zz[]=new int[6];

for ( i = 0 ; i 48 ; i += 6) { /*进行8轮循环*/

for(int j=0,box=i;j6;j++,box++){

zz[j]=key1[box];

}

x = handle_data(data11,zz);

tmp = data11[1]; /*交换中间两个*/

data11[1] = data11[2];

data11[2] = tmp;

}

tmp = data11[1]; /*最后一轮不交换*/

data11[1] = data11[2];

data11[2] = tmp;

data11[0] = MUL(data11[0],key1[48]);

data11[1] =(char)((data11[1] + key1[49])%0x10000);

data11[2] =(char)((data11[2] + key1[50])%0x10000);

data11[3] = MUL(data11[3],key1[51]);

}

2.解密过程的实现

void key_decryExp(int outkey[])/*解密密钥的变逆处理*/

{ int tmpkey[] = new int[52] ;

int i;

for ( i = 0 ; i 52 ; i++) {

tmpkey[i] = outkey[ wz_spkey[i] ] ;/*换位*/

}

for ( i = 0 ; i 52 ; i++) {

outkey[i] = tmpkey[i];

}

for ( i = 0 ; i 18 ; i++) {

outkey[wz_spaddrever[i]] = (char)(65536-outkey[wz_spaddrever[i]]) ;/*替换成加法逆*/

}

for ( i = 0 ; i 18 ; i++){

outkey[wz_spmulrevr[i]] =(char)(mulInv(outkey[wz_spmulrevr[i]] ));/*替换成乘法逆*/

}

}

四、总结

在实际应用中,我们可以使用Java开发工具包(JDK)中内置的对Socket通信的支持,通过JCE中的Java流和链表,加密基于Socket的网络通信.我们知道,加密/解密是数据传输中保证数据完整性的常用方法,Java语言因其平台无关性,在Internet上的应用非常之广泛.使用Java实现基于IDEA的数据加密传输可以在不同的平台上实现并具有实现简洁、安全性强等优点。

北大青鸟java培训:网络运营安全密钥的算法问题?

随着互联网的不断发展,为了保护我们的信息在网络上的安全性,通常都会基于安全算法和密钥来实现的。

今天,IT培训就通过案例分析来了解一下关于安全密钥的算法问题。

DES算法简介DES(DataEncryptionStandard)是目前为流行的加密算法之一。

DES是对称的,也就是说它使用同一个密钥来加密和解密数据。

DES还是一种分组加密算法,该算法每次处理固定长度的数据段,称之为分组。

DES分组的大小是64位,如果加密的数据长度不是64位的倍数,可以按照某种具体的规则来填充位。

从本质上来说,DES的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混乱和扩散”的原则。

混乱的目的是为隐藏任何明文同密文、或者密钥之间的关系,而扩散的目的是使明文中的有效位和密钥一起组成尽可能多的密文。

两者结合到一起就使得安全性变得相对较高。

DES算法具体通过对明文进行一系列的排列和替换操作来将其加密。

过程的关键就是从给定的初始密钥中得到16个子密钥的函数。

要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复16次。

每一次迭代称之为一轮。

要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。

计算16个子密钥上面提到DES算法的一步就是从初始密钥中计算得出16个子密钥。

DES使用一个56位的初始密钥,但是这里提供的是一个64位的值,这是因为在硬件实现中每8位可以用于奇偶校验,在软件实现中多出的位只是简单的忽略掉。

要获得一个56位的密钥,可以执照表1的方式执行密钥转换。

DES算法的实现考虑到DES算法中涉及的位操作很多,因此DES算法通常都是在硬件中实现。

DES算法中的图表和术语(通过线、框画的流程图,以及诸如S盒、P盒这样的术语)使其更倾向于在硬件中实现,当然,软件实现也有它的价值所在。

在软件开发中,通过几种基本的指令操作来帮助实现DES中的各种置换、转换以及替换操作都是很有效的。

java web开发用户注册时密码加密一般用什么技术?

MD5加密,这是一种不可逆的加密算法,即一旦进行MD5加密算法,不能再得到原始的密码\x0d\x0a \x0d\x0a开发者可以将用户输入的密码进行MD5加密后,再与数据库中存储的加密后的密码比较,即可知道密码的准确性。\x0d\x0a \x0d\x0a若想找回密码,一种即可以重置密码,即有一个默认的密码。重置后,可以自己再修改密码;另一种即可以通过其他方面的验证后,来录入一个新密码。现在很多都是使用邮箱验证或是手机随机验证,验证成功后,可以设置新密码

常见密码算法原理

PBKDF2(Password-Based Key Derivation Function)是一个用来导出密钥的函数,用来生成加密的密码,增加破解的难度,类似bcrypt/scrypt等,可以用来进行密码或者口令的加密存储。主要是盐值+pwd,经过多轮HMAC算法的计算,产生的密文。

PBKDF2函数的定义

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

• PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果。

• Password是用来生成密钥的原文密码。

• Salt是一个加密用的盐值。

• c是进行重复计算的次数。

• dkLen是期望得到的密钥的长度。

• DK是最后产生的密钥。

下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理。

1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g。

2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个私有的数字a,b。

下面是DH交换的过程图:

本图片来自wiki

下面我们进行一个实例

1.爱丽丝与鲍伯协定使用p=23以及g=5.

2.爱丽丝选择一个秘密整数a=6, 计算A = g^a mod p并发送给鲍伯。

A = 5^6 mod 23 = 8.

3.鲍伯选择一个秘密整数b=15, 计算B = g^b mod p并发送给爱丽丝。

B = 5^15 mod 23 = 19.

4.爱丽丝计算s = B a mod p

19^6 mod 23 = 2.

5.鲍伯计算s = A b mod p

8^15 mod 23 = 2.

ECDH:

ECC算法和DH结合使用,用于密钥磋商,这个密钥交换算法称为ECDH。交换双方可以在不共享任何秘密的情况下协商出一个密钥。ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上。密钥磋商过程:

假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。

来自

exponent1 INTEGER, -- d mod (p-1)

exponent2 INTEGER, -- d mod (q-1)

coefficient INTEGER, -- (inverse of q) mod p

otherPrimeInfos OtherPrimeInfos OPTIONAL

}

-----END RSA PRIVATE KEY-----

while a RSA public key contains only the following data:

-----BEGIN RSA PUBLIC KEY-----

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

-----END RSA PUBLIC KEY-----

and this explains why the private key block is larger.

Note that a more standard format for non-RSA public keys is

-----BEGIN PUBLIC KEY-----

PublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier,

PublicKey BIT STRING

}

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

-----END PUBLIC KEY-----

More info here.

BTW, since you just posted a screenshot of the private key I strongly hope it was just for tests :)

密钥的长度

C:\herongjava RsaKeyGenerator 128

p: 17902136406704537069

q: 17902136406704537077

m: 320486487924256034368552058949822333168

Modulus: 320486487924256034404356331763231407313

Key size: 128

Public key: 138184930940463531660820083778072069237

Private key: 173448309040289888328993883042709949325

C:\herongjava RsaKeyGenerator 256

p: 248658744261550238073459677814507557459

q: 248658744261550238073459677814507557527

m: 618311710977310434529034534762836648859088873902738200302650613...

Modulus: 618311710977310434529034534762836648864062048787969205064...

Key size: 256

Public key: 394190853336940694532345943348534965939075733405768734...

Private key: 21429568381701961014089098585280129682302896350728470...

update() adds data to the Cipher’s internal buffer, then returns all currently completely encoded blocks. If there are any encoded blocks left over, they remain in the Cipher’s buffer until the next call, or a call to doFinal(). This means that if you call update() with a four byte array to encrypt, and the buffer size is eight bytes, you will not receive encoded data on the return (you’ll get a null instead). If your next call to update() passes five bytes of data in, you will get an 8 byte (the block size) array back, containing the four bytes passed in on the previous call, the first four bytes from the current call – the remaining byte from the current call is left in the Cipher’s buffer.

doFinal() on the other hand is much simpler: it encrypts the passed data, pads it out to the necessary length, and then returns it. The Cipher is essentially stateless.

来自

DH算法的中间人攻击

在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务,因此它很容易受到中间人攻击。 一个中间人在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和Alice另一次和Bob,就能够成功的向Alice假装自己是Bob,反之亦然。而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。

优缺点:

1、 仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会。

2、 除对全局参数的约定外,密钥交换不需要事先存在的基础结构。

然而,该技术也存在许多不足:

1、 没有提供双方身份的任何信息。

2、 它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作。

3、 没办法防止重演攻击。

4、 容易遭受中间人的攻击。第三方C在和A通信时扮演B;和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。中间人的攻击按如下进行:

(1) B在给A的报文中发送他的公开密钥。

(2) C截获并解析该报文。C将B的公开密钥保存下来并给A发送报文,该报文具有B的用户ID但使用C的公开密钥YC,仍按照好像是来自B的样子被发送出去。A收到C的报文后,将YC和B的用户ID存储在一块。类似地,C使用YC向B发送好像来自A的报文。

(3) B基于私有密钥XB和YC计算秘密密钥K1。A基于私有密钥XA和YC计算秘密密钥K2。C使用私有密钥XC和YB计算K1,并使用XC和YA计算K2。

(4) 从现在开始,C就可以转发A发给B的报文或转发B发给A的报文,在途中根据需要修改它们的密文。使得A和B都不知道他们在和C共享通信。

java密码学算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于密码法算法、java密码学算法的信息别忘了在本站进行查找喔。