求教RSA加密得问题,散尽所有分数

wuliang416 2003-07-19 04:20:09
我用的是bouncycastle的provider

Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.DECRYPT_MODE,sK); //sK 是一个PublicKey
rsaCipher.update("Hello World".getBytes("UTF8"));
byte[] cipheredText = rsaCipher.doFinal();

这段代码会产生一个NonePointException,DES算法用一样的方法加密就没问题。
请教高手这是怎么回事?还有下面得代码会产生同样得错误

Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.DECRYPT_MODE,sK);
rsaCipher.update("Hello World".getBytes("UTF8"));
rsaCipher.doFinal();

FileInputStream in = new FileInputStream(args[1]);
FileOutputStream out = new FileOutputStream(args[2]);
CipherInputStream cin = new CipherInputStream(in,rsaCipher);

int b = 0;
while((b = cin.read()) != -1){
out.write(b);
}
out.close();
cin.close();

小弟刚刚来CSDN没有多少积蓄,哪位大侠能救救5,偶散尽所有分数答谢
...全文
25 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fpwang 2003-11-20
  • 打赏
  • 举报
回复
up
haoren0625 2003-11-20
  • 打赏
  • 举报
回复
学习!!!
typecheese12345 2003-11-20
  • 打赏
  • 举报
回复
//------------------------------------------------------------------------------------check2
//检查是否前(2560-1024+b前0的个数)位都为0//判断是否继续减
int check(rsaint_4 a,rsaint_2 n)
{
int i=check2(a),j=check(n);
if(i<j) return 0;
if(i>j) return 1;
if(i==j)
{ //cout<<"good"<<endl;
while(a.rsa[i]==n.rsa[j]&&i>=0)
{
i--;
j--;
}
if(a.rsa[i]>n.rsa[j]) {/*cout<<"正在模运算";*/return 1;}
else if(a.rsa[i]<n.rsa[j]) return 0;
{cout<<"答案为0";exit(-1);}
}

}

//-----------------------------------------------------------------------------------------
//判断是否错位减
int check_minus(rsaint_4 a,rsaint_2 b)
{
//cout<<"判断是否错位减"<<endl;
int i=check2(a);
int j=check(b);
while(a.rsa[i]==b.rsa[j])
{i--;j--;}
if(a.rsa[i]>b.rsa[i])
return 0;
else
return 1;
}
//-----------------------------------------------------------------------------------------
//不错位的减
rsaint_4 ready_minus(rsaint_4 a,rsaint_2 b)
{
// cout<<"不错位的减"<<endl;
rsaint_4 x=a;
int i=check2(x);cout<<i<<endl;
int j=check(b);cout<<j<<endl;
for(int u=j;u!=-1;u--)
{
x.rsa[i]=x.rsa[i]-b.rsa[u];
i--;
}cout<<x<<endl;
return x;
}
//------------------------------------------------------------------------------------------
//错位的减
rsaint_4 ready_minus2(rsaint_4 a,rsaint_2 b)
{
// cout<<"错位的减"<<endl;
rsaint_4 x=a;
int i=check2(x);
int j=check(b);
for(int u=j;u!=-1;u--)
{
i--;
x.rsa[i]=x.rsa[i]-b.rsa[u];
}//cout<<x<<endl;
return x;
}
//------------------------------------------------------------------------------------------
//减后伺候
rsaint_4 after_minus(rsaint_4 a)
{ //cout<<"减后伺候"<<endl;
int find_wrong=num4-1;//check
while(a.rsa[find_wrong]==0&&find_wrong>=0)//check
find_wrong--;//check
if(a.rsa[find_wrong]!=1) {cout<<"death";exit(-1);}//check
rsaint_4 x=a;
for(int j=0;j<num4-1;j++)
{
if(x.rsa[j]==-1)//j为-1所在
{ x.rsa[j]=0;
int u=0;
while(x.rsa[u+j]!=1)
{
x.rsa[u+j]++;
u++;//----------------------------------------kaolv
}
x.rsa[u+j]=0;
//while(a.rsa[j]>=2) {cout<<"enter";a.rsa[j+1]++;a.rsa[j]=a.rsa[j]-2;}
}
}
return x;
}
//------------------------------------------------------------------------------------------
//最困难的MOD运算
rsaint_2 rsamod(rsaint_4 a,rsaint_2 b)
{ rsaint_4 x=a;
while(check(x,b)==1)//判断是否继续减
{
if(check_minus(x,b)==1)
{x=ready_minus2(x,b);}
else if(check_minus(x,b)==0)
{x=ready_minus2(x,b);}
x=after_minus(x);
}
rsaint_2 aa;aa=initialization(aa);
for(int i=0;i<num2-1;i++)
aa.rsa[i]=x.rsa[i];
return aa;
}
//------------------------------------------------------------------------------------------
//最关键算法的实现。
//temp是initialization2()特别处理的rsaint_2
rsaint_2 rsapow(rsaint_2 n,rsaint b,rsaint x,rsaint_2 temp)
{
for(int i=num1-1;i!=-1;i--)
{ //cout<<i<<"point left"<<endl;
temp=rsamod(temp*(temp*(x*b.rsa[i])),n);//x*b.rsa[i]要重新定义。rsamod(),temp*rsaint也要定义。
// if(i<=10) cout<<temp<<endl;
}
return temp;
}

//------------------------------------------------------------------------------------------
/*void main()
{
rsaint_2 a;rsaint b;
a=initialization(a);
b=initialization(b);

a.rsa[1]=1;
a.rsa[2]=1;a.rsa[4]=1;b.rsa[0]=1;b.rsa[1]=1;b.rsa[3]=1;

//cout<<a*b<<endl;
cout<<check((b*b)*(a*b),b*b);
}
*/
void main()
{cout<<"rsa算法按bit运算,请稍等....."<<endl;
cout<<"如例子P=5,Q=7,N=35,B=11,X=2 答案为18" <<endl;
cout<<"明文:"<<endl;
rsaint p,q,x,b;
rsaint_2 n,temp,f;
p=initialization(p);
q=initialization(q);
x=initialization(x);
b=initialization(b);

n=initialization(n);
f=initialization(f);
temp=initialization2(temp);

p.rsa[0]=1;p.rsa[2]=1;//5
q.rsa[0]=1;q.rsa[2]=1;q.rsa[1]=1;//7
n=p*q;
cout<<n<<endl;
p.rsa[0]=0;
q.rsa[0]=0;
f=p*q;
x.rsa[1]=1;//2
b.rsa[0]=1;b.rsa[1]=1;b.rsa[3]=1;//11
//cout<<pow(512,20);
rsaint_2 k=rsapow(n,b,x,temp);//void after_minus(rsaint_3 a)为O(n2)复杂度
cout<<"密文"<<endl;
cout<<k<<endl;cout<<"type_cai";

}
typecheese12345 2003-11-20
  • 打赏
  • 举报
回复
#include<iostream.h>
#include"math.h"
#include"stdlib.h"
#include<iomanip.h>
const int num1=256;
const int num2=512;
const int num3=768;
const int num4=1280;
//------------------------------------------------------------------------------------check
struct rsaint{
int rsa[num1];
};

struct rsaint_1{
int rsa[num1];
int rsa_temp;
};
struct rsaint_2{
int rsa[num2];
};
struct rsaint_3{
int rsa[num3];
};
struct rsaint_4{
int rsa[num4];
};
//-----------------------------------------------------------------------------------check
rsaint_1 operator+(rsaint a,rsaint b)
{rsaint_1 d;
int temp=0;
for(int i=0;i<num1;i++){
d.rsa[i]=a.rsa[i]+b.rsa[i]+temp;
temp=0;
if(d.rsa[i]>=10)
{d.rsa[i]=d.rsa[i]-10;
temp++;}
}
d.rsa_temp=temp;
return d;
}
//------------------------------------------------------------------------------------check
rsaint initialization (rsaint a)
{ //srand(6);
for(int i=0;i<num1;i++)
a.rsa[i]=rand()%2;
return a;
}
rsaint_1 initialization (rsaint_1 a)
{ a.rsa_temp=0;
for(int i=0;i<num1;i++)
a.rsa[i]=0;
return a;
}
rsaint_2 initialization (rsaint_2 a)
{
for(int i=0;i<num2;i++)
a.rsa[i]=0;
return a;
}
rsaint_2 initialization2 (rsaint_2 a)
{
for(int i=0;i<num2;i++)
a.rsa[i]=0;
a.rsa[0]=1;
return a;
}
rsaint_3 initialization (rsaint_3 a)
{
for(int i=0;i<num3;i++)
a.rsa[i]=0;
return a;
}
rsaint_4 initialization (rsaint_4 a)
{
for(int i=0;i<num4;i++)
a.rsa[i]=0;
return a;
}
//-----------------------------------------------------------------------------------check
ostream & operator<<(ostream &os,rsaint_2 c)
{
for(int i=num2-1;i!=-1;i--)
os<<c.rsa[i];
return os;
}
//-----------------------------------------------------------------------------------check
ostream & operator<<(ostream &os,rsaint_4 c)
{
for(int i=num4-1;i!=-1;i--)
os<<c.rsa[i];
return os;
}
//-----------------------------------------------------------------------------------check
rsaint_2 operator*(rsaint a,rsaint b)
{rsaint_2 c;
c=initialization(c);
//关键头(乘法)
int h=0;
for(int i=0;i<num1;i++)
{for(int j=0;j<num1;j++)
c.rsa[j+h]=a.rsa[i]*b.rsa[j]+c.rsa[j+h];
h++;}
//关键末(乘法)
//关键(乘后的处理)
for(int k=0;k<num2;k++)
{
while(c.rsa[k]>=2)
{c.rsa[k]=c.rsa[k]-2;
c.rsa[k+1]++;
}
}
return c;}
//------------------------------------------------------------------------------------check
//rsaint与0或1的乘法
rsaint operator*(rsaint a,int x)
{
if(x==0)
{
initialization(a);
for(int i=0;i<num1;i++)//调试后去掉
a.rsa[i]=0;//调试后去掉
a.rsa[0]=1;
}
return a;
}
//-----------------------------------------------------------------------------------check
//1024位的rsaint_2与512位的rsaint相乘得1536位的rsaint_3
rsaint_3 operator*(rsaint_2 temp,rsaint xb)
{
rsaint_3 c;
c=initialization(c);
int h=0;
for(int i=0;i<num1;i++)
{
for(int j=0;j<num2;j++)
c.rsa[j+h]=xb.rsa[i]*temp.rsa[j]+c.rsa[j+h];
h++;
}
for(int k=0;k<num3;k++)
{
while(c.rsa[k]>=2)
{
c.rsa[k]=c.rsa[k]-2;
c.rsa[k+1]++;
}
}
return c;
}
//--------------------------------------------------------------------------------check
//1536位的rsaint_3与1024位的rsaint_2相乘得2560位的rsaint_4
rsaint_4 operator*(rsaint_2 temp,rsaint_3 xb)
{
rsaint_4 c;
c=initialization(c);
int h=0;
for(int i=0;i<num3;i++)
{
for(int j=0;j<num2;j++)
c.rsa[j+h]=xb.rsa[i]*temp.rsa[j]+c.rsa[j+h];
h++;
}
for(int k=0;k<num4;k++)
{
while(c.rsa[k]>=2)
{
c.rsa[k]=c.rsa[k]-2;
c.rsa[k+1]++;
}
}//cout<<"2560c:"<<c<<endl;
return c;
}
//---------------------------------------------------------------------------------check2
//检查第一个1的位置
int check(rsaint_2 a)
{
int i=num2-1;
while(a.rsa[i]==0&&i>=0)
i--;
if(a.rsa[i]==-1) {cout<<"wrong1";exit(-1);}
return i;
}

int check2(rsaint_4 a)
{//cout<<"检查第一个1的位置 "<<endl;
int i=num4-1;
while(a.rsa[i]==0&&i>=0)
i--;//cout<<i;
if(a.rsa[i]==-1) {cout<<"wrong2";exit(-1);}
return i;
}
jouny0 2003-07-19
  • 打赏
  • 举报
回复
up
wuliang416 2003-07-19
  • 打赏
  • 举报
回复
多谢两位大侠:-)
disk 2003-07-19
  • 打赏
  • 举报
回复
看一下,礼拜一给你代码
jimshen 2003-07-19
  • 打赏
  • 举报
回复
先关注一下,后天答复

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧