ورود

View Full Version : سوال: مشکل در تبدیل آرایه ای از بایت به رشته (حروف غیر لاتین) خیلی فوری



mohamadng
پنج شنبه 31 شهریور 1390, 10:54 صبح
با سلام
کد زیر مربوط به پروژه بنده در مورد انتقال پیام کوتاه رمز نگاری شده است. این نرم افزار را برای گوشیهای سونی اریکسون پلت فورم جاوا مانند k750 , k530 طراحی می شود.

public String encryption(String msg) throws Exception {
String cipherText="";
BigInteger dataBI;
String s1=new String();
RSACipherTextPair ctp;
byte[]msgByte=msg.getBytes("UTF-8");
int q=modulusLength-1;
int index=0,size=msgByte.length;
while(size-index>=q){
byte b[]=new byte[q];
System.arraycopy(msgByte, index, b, 0, b.length);
index+=q;
dataBI=new BigInteger(1,b);
ctp=RSACryptoAlgorithm.RSAep(pubKey,dataBI);
cipherText+=ctp.getCipherText().toString();
cipherText+=" ";
}
if(size-index>0){
byte b2[]=new byte[size-index];
System.arraycopy(msgByte, index, b2, 0, b2.length);
index+=q;
dataBI=new BigInteger(1, b2);
ctp=RSACryptoAlgorithm.RSAep(pubKey,dataBI);
cipherText+=ctp.getCipherText().toString();
cipherText+=" ";
}
cipherText=cipherText.substring(0, cipherText.length()-1);
return cipherText;
}
public String decryption(String ss) throws Exception{
String str ="";
String s;
byte[]b = null;
BigInteger delta , cipherBI;
boolean bool=true;
int index=0;
while(bool){
s=getsubString(ss, index);
if(s.length()==0)
break;
delta=new BigInteger(s);
cipherBI=RSACryptoAlgorithm.RSAdp(privKey,new RSACipherTextPair(delta));
byte[]cipherbyte=cipherBI.toByteArray();
b=mergeByteArray(b, cipherbyte);
index+=s.length()+1;
if(index>=ss.length())
bool=false;
}
String txt=new String(b,"UTF-8");
str+=txt;
return str;
}
private String getsubString(String s, int index){
int j;
boolean end=true;
for(j=index;j<s.length();j++){
if(!Character.isDigit(s.charAt(j))){
end=false;
break;
}
}
if(j==index)
return "";
if(end)
return s.substring(index, s.length());
return s.substring(index, j);
}
private byte[] mergeByteArray(byte[] b, byte[]bb){
if(b==null)
return bb;
if(b.length==0)
return bb;
byte [] merge=new byte[b.length+bb.length];
for(int i=0;i<merge.length;i++){
if(i<b.length)
merge[i]=b[i];
else
merge[i]=bb[i-b.length];
}
return merge;
}
این کد بر روی شبیه ساز گوشی های ذکر شده کار میکنه ولی وقتی که روی خود گوشی ها تست می کنم با فارسی مشکل داره.
مشکل اینه که در تابع encryption وقتی ارایه ای از بایت رو به string با فورمت utf-8 تبدیل میکنم روی گوشی کار نمی کنه( برای حروف لاتین مشکلی نداره!)
لطفا منو راهنمایی کنید
کدین پیش فرض گوشی ISO-8859-1 است که حروف فارسی رو علامت سوال نشون میده.
نوع رمز نگاری هم RSA است.

ghasem.fattahpour
پنج شنبه 31 شهریور 1390, 18:51 عصر
باید کاراکتر ها رو تبدیل به عدد کنی تا هم مشکل رمز نگاریت حل بشه و هم سرعتت بره بالا.

mohamadng
پنج شنبه 31 شهریور 1390, 19:54 عصر
باید کاراکتر ها رو تبدیل به عدد کنی تا هم مشکل رمز نگاریت حل بشه و هم سرعتت بره بالا.

سلام خیلی ممنون ولی چند تا کاراکتر رو به عدد تبدیل کنم! (65535 کاراکتر). حجم متن هم خیلی میره بالا آخه میخوام با sms اون متن رو ارسال کنم. اگه میشه یه راه حل دیگه ممنون

ghasem.fattahpour
جمعه 01 مهر 1390, 00:08 صبح
دوست من بدون که کاراکتر textsms برابر ۷ بیت و هر textsms برابر ۱۶۰ کاراکتر هست اما هر smsbinary برابر است با ۱۴۰ بایت ۸ بیتی. ما حداکثر ۱۲۸ کاراکتر عدد و فارسی و انگلیسی داریم. هر ۴ بیت ۱ عدد. متوجه شدی؟

dr_jacky_2005
جمعه 01 مهر 1390, 10:41 صبح
هر ۴ بیت ۱ عدد. متوجه شدی؟
قبول
ولی 1 عدد چند رقمی؟!

ghasem.fattahpour
جمعه 01 مهر 1390, 13:33 عصر
یک بار دیگه متن رو بخونید کامل توضیح دادم.