您的位置:

php实现java的rsa加密(java rsa加密算法)

本文目录一览:

这段JAVA加密用php怎么写?

php写法如下:

?PHP

/**

* AES加密、解密类

* @author hushangming

*

* 用法:

* pre

* // 实例化类

* // 参数$_bit:格式,支持256、192、128,默认为128字节的

* // 参数$_type:加密/解密方式,支持cfb、cbc、nofb、ofb、stream、ecb,默认为ecb

* // 参数$_key:密钥,默认为abcdefghijuklmno

* $tcaes = new TCAES();

* $string = 'laohu';

* // 加密

* $encodeString = $tcaes-encode($string);

* // 解密

* $decodeString = $tcaes-decode($encodeString);

* /pre

*/

class TCAES{

private $_bit = MCRYPT_RIJNDAEL_256;

private $_type = MCRYPT_MODE_CBC;

//private $_key = 'abcdefghijuklmno0123456789012345';

private $_key = 'abcdefghijuklmno'; // 密钥

private $_use_base64 = true;

private $_iv_size = null;

private $_iv = null;

/**

* @param string $_key 密钥

* @param int $_bit 默认使用128字节

* @param string $_type 加密解密方式

* @param boolean $_use_base64 默认使用base64二次加密

*/

public function __construct($_key = '', $_bit = 128, $_type = 'ecb', $_use_base64 = true){

// 加密字节

if(192 === $_bit){

$this-_bit = MCRYPT_RIJNDAEL_192;

}elseif(128 === $_bit){

$this-_bit = MCRYPT_RIJNDAEL_128;

}else{

$this-_bit = MCRYPT_RIJNDAEL_256;

}

// 加密方法

if('cfb' === $_type){

$this-_type = MCRYPT_MODE_CFB;

}elseif('cbc' === $_type){

$this-_type = MCRYPT_MODE_CBC;

}elseif('nofb' === $_type){

$this-_type = MCRYPT_MODE_NOFB;

}elseif('ofb' === $_type){

$this-_type = MCRYPT_MODE_OFB;

}elseif('stream' === $_type){

$this-_type = MCRYPT_MODE_STREAM;

}else{

$this-_type = MCRYPT_MODE_ECB;

}

// 密钥

if(!empty($_key)){

$this-_key = $_key;

}

// 是否使用base64

$this-_use_base64 = $_use_base64;

$this-_iv_size = mcrypt_get_iv_size($this-_bit, $this-_type);

$this-_iv = mcrypt_create_iv($this-_iv_size, MCRYPT_RAND);

}

/**

* 加密

* @param string $string 待加密字符串

* @return string

*/

public function encode($string){

if(MCRYPT_MODE_ECB === $this-_type){

$encodeString = mcrypt_encrypt($this-_bit, $this-_key, $string, $this-_type);

}else{

$encodeString = mcrypt_encrypt($this-_bit, $this-_key, $string, $this-_type, $this-_iv);

}

if($this-_use_base64)

$encodeString = base64_encode($encodeString);

return $encodeString;

}

/**

* 解密

* @param string $string 待解密字符串

* @return string

*/

public function decode($string){

if($this-_use_base64)

$string = base64_decode($string);

$string = $this-toHexString($string);

if(MCRYPT_MODE_ECB === $this-_type){

$decodeString = mcrypt_decrypt($this-_bit, $this-_key, $string, $this-_type);

}else{

$decodeString = mcrypt_decrypt($this-_bit, $this-_key, $string, $this-_type, $this-_iv);

}

return $decodeString;

}

/**

* 将$string转换成十六进制

* @param string $string

* @return stream

*/

private function toHexString ($string){

$buf = "";

for ($i = 0; $i strlen($string); $i++){

$val = dechex(ord($string{$i}));

if(strlen($val) 2)

$val = "0".$val;

$buf .= $val;

}

return $buf;

}

/**

* 将十六进制流$string转换成字符串

* @param stream $string

* @return string

*/

private function fromHexString($string){

$buf = "";

for($i = 0; $i strlen($string); $i += 2){

$val = chr(hexdec(substr($string, $i, 2)));

$buf .= $val;

}

return $buf;

}

}

PHP 加密:AES & RSA

最近两年一直从事与金融相关项目的开发与维护。但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识。

为了避免各位看枯燥的文字理论,开篇我就把总结给出:

一、对称加密

对称加密的特点是加解密速度快,加密后的密文强度目前还没有硬解的可能性。但是,在未来随着计算机性能的提升有可能会出现被破解的可能性。

对称加密的缺点也很明显。对称加密的加密过程与解密过程使用的是同一把密钥。一旦泄漏密钥,加密就失去了任何意义。

根据《图解密码技术》一书的推荐,对称加密目前推荐使用 AES。在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现。所以,请确保你的 PHP 已经开启了 openssl 扩展。

可以通过如下方式检测:

或者如下方式检测:

AES 的加密模式属于分组密码模式。所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密。当然,细节之处很很多不同。AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式。目前优先推荐使用 CBC 模式。

如果使用 CBC 模式,那么在加密的时候,就需要一个前置的加密向量 IV。当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量。因为,在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了。没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值。关于这个向量大家可以在网上查阅相关的资料。这个东西非常重要,也非常好理解。

关于 PHP AES 加解密会用到的相关方法:

AES 支持三种强度:128、192、256。128 位的强度最低,但是,加密解密速度较快。256 位强度最高,但是,加密解密速度最低。所以,大家根据自己系统的重要程度选择使用对应强度。通常普通的金融项目使用 192 位完整够用了。顶级的就用 256 位。其他的就用 128 位吧。

二、非对称加密

非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法。非对称加密的算法有很多。《图解密码技术》一书推荐使用 RSA 算法。它使用起来也非常简单。

要使用 RSA 算法。首先,我们必须生成一对公钥私钥。其实生成公钥私钥很简单。

在 Linux 系统,直接使用如下命令生成:

此命令会生 ~/.ssh/ 目录下生成两个文件:

id_rsa 是私钥, is_rsa.pub 是公钥。

关于 PHP RSA 加解密会用到的相关方法:

以上就是关于在 PHP 项目开发中,我们使用的加密解密算法的一个总结。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!

php rsa/no/padding加密怎么实现

Java和PHP RSA加密实现互通

1:通过openssl 生成公钥和密钥文件(Linux)

(1) 生产私钥文件命令

openssl genrsa -out rsa_private_key.pem 1024

(2) 通过私钥文件生成公钥命令

openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout

(3) 将传统格式的私钥转换成 PKCS#8 格式的的密钥文件

openssl pkcs8 -topk8 -in rsa_private_key.pem -outpkcs8_rsa_private_key.pem -nocrypt

高分求java的RSA 和IDEA 加密解密算法

RSA算法非常简单,概述如下:

找两素数p和q

取n=p*q

取t=(p-1)*(q-1)

取任何一个数e,要求满足et并且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,满足et并且e和t互素

用perl简单穷举可以获得满主 e*d%t ==1的数d:

C:\Tempperl -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:\Tempperl -Mbigint -e "print 244**847%2773"

465

即用d对M加密后获得加密信息c=465

解密:

我们可以用e来对加密后的c进行解密,还原M:

m=c**e%n=465**63%2773 :

C:\Tempperl -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-copy(); $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-copy(); $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:\Tempperl rsa-test.pl

N=2773 D=847 E=63

原始串:RSA 娃哈哈哈~~~

加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4

解密串:RSA 娃哈哈哈~~~

C:\Tempperl rsa-test.pl 安全焦点(xfocus)

N=2773 D=847 E=63

原始串:安全焦点(xfocus)

加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B

解密串:安全焦点(xfocus)

四提高

前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,

我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。

通过工具,我们获得1024位的N及D E来测试一下:

n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005D

BDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B

47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2

BC511951

d=0x10001

e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C2995

4C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2

C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B

1965

设原始信息

M=0x11111111111122222222222233333333333

完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:

A) 用d对M进行加密如下:

c=M**d%n :

C:\Tempperl -Mbigint -e " $x=Math::BigInt-bmodpow(0x11111111111122222222222233

333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5F

CD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F0

17F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD6

0438941D2ED173CCA50E114705D7E2BC511951);print $x-as_hex"

0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd

45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b

3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91

f1834580c3f6d90898

即用d对M加密后信息为:

c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd

45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b

3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91

f1834580c3f6d90898

B) 用e对c进行解密如下:

m=c**e%n :

C:\Tempperl -Mbigint -e " $x=Math::BigInt-bmodpow(0x17b287be418c69ecd7c39227ab

681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3

866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb4764414

65f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A

3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D

86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF

2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A

592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90

B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF

1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941

D2ED173CCA50E114705D7E2BC511951);print $x-as_hex"

0x11111111111122222222222233333333333

(我的P4 1.6G的机器上计算了约5秒钟)

得到用e解密后的m=0x11111111111122222222222233333333333 == 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.println("error writing to file");

}

/**

* Close input stream and file writer

*/

try {

is.close();

writer.close();

}

catch (IOException e1) {

System.out.println("Error closing file.");

}

}

public void decodeFile (String filename) {

FileReader reader = null;

OutputStream os = null;

try {

reader = new FileReader(filename);

os = new FileOutputStream(filename.replaceAll(".enc", ".dec"));

}

catch (FileNotFoundException e1) {

if (reader == null)

System.out.println("File not found: " + filename);

else

System.out.println("File not found: " + filename.replaceAll(".enc", "dec"));

}

BufferedReader br = new BufferedReader(reader);

int offset;

byte[] temp, toFile;

StringTokenizer st = null;

try {

while (br.ready()) {

st = new StringTokenizer(br.readLine());

while (st.hasMoreTokens()){

toFile = encodeDecode(new BigInteger(st.nextToken())).toByteArray();

System.out.println(toFile.length + " x " + (blockSize / 8));

if (toFile[0] == 0 toFile.length != (blockSize / 8)) {

temp = new byte[blockSize / 8];

offset = temp.length - toFile.length;

for (int i = toFile.length - 1; (i = 0) ((i + offset) = 0); --i) {

temp[i + offset] = toFile[i];

}

toFile = temp;

}

/*if (toFile.length != ((blockSize / 8) + 1)){

temp = new byte[(blockSize / 8) + 1];

System.out.println(toFile.length + " x " + temp.length);

for (int i = 1; i temp.length; i++) {

temp[i] = toFile[i - 1];

}

toFile = temp;

}

else

System.out.println(toFile.length + " " + ((blockSize / 8) + 1));*/

os.write(toFile);

}

}

}

catch (IOException e1) {

System.out.println("Something went wrong");

}

/**

* close data streams

*/

try {

os.close();

reader.close();

}

catch (IOException e1) {

System.out.println("Error closing file.");

}

}

/**

* Performs ttbase/tt^supttpow/tt/sup within the modular

* domain of ttmod/tt.

*

* @param base the base to be raised

* @param pow the power to which the base will be raisded

* @param mod the modular domain over which to perform this operation

* @return ttbase/tt^supttpow/tt/sup within the modular

* domain of ttmod/tt.

*/

public BigInteger encodeDecode(BigInteger base) {

BigInteger a = ONE;

BigInteger s = base;

BigInteger n = myKey;

while (!n.equals(ZERO)) {

if(!n.mod(TWO).equals(ZERO))

a = a.multiply(s).mod(myMod);

s = s.pow(2).mod(myMod);

n = n.divide(TWO);

}

return a;

}

}

在这里提供两个版本的RSA算法JAVA实现的代码下载:

1. 来自于 的RSA算法实现源代码包:

2. 来自于 的实现:

- 源代码包

- 编译好的jar包

另外关于RSA算法的php实现请参见文章:

php下的RSA算法实现

关于使用VB实现RSA算法的源代码下载(此程序采用了psc1算法来实现快速的RSA加密):

RSA加密的JavaScript实现:

java加密用PHP解密

当然可以,加密解密算法都是通用的,可以用对称加密或者是非对称加密!

为了安全性,建议使用Rsa非对称加密。

支付宝支付也是使用Rsa算法,不分语言,php和java都有现成的方法可以使用!

php实现rsa算法,该怎么处理

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密

加密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

openssl genrsa -out rsa_private_key.pem 1024

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem