1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| ///formulaire de paiement
f2 = new Form("Formulaire de paiement");
f2.setTicker(ticker);
montant = new TextField("Montant à payer(TND):", "", 16,
TextField.ANY);
num_Carte = new TextField("Numéro de carte bancaire:", "", 16,
TextField.PHONENUMBER);
sti = new StringItem(null, "Date d'expiration");
date_expjour = new TextField("Jour: ", "", 2,
TextField.PHONENUMBER);
date_expmois = new TextField("Mois: ", "", 2,
TextField.PHONENUMBER);
date_expannee = new TextField("Année: ", "", 4,
TextField.PHONENUMBER);
code_Secret = new TextField("Code secret:", "", 4,
TextField.PHONENUMBER);
trois_chiff = new TextField("Trois derniers chiffres:", "", 3,
TextField.PHONENUMBER);
f2.append(montant);
f2.append(num_Carte);
f2.append(sti);
f2.append(date_expjour);
f2.append(date_expmois);
f2.append(date_expannee);
f2.append(code_Secret);
f2.append(trois_chiff);
display.setCurrent(f2);
f2.addCommand(backCommand);
f2.addCommand(send);
f2.setCommandListener(this);
//construction de la clé et cryptage
String modulus="AM8sVwRf8AnUjVpImOQuB5lKYDtzlHJMcQ0aRi2zFh2Jd+V0J8UhpIU1OnIBCj5SW1+L34hWqLmibFwv34XNxC0=";
String publicExp="AQAB"
String s1 = montant.getString();
String s2 = num_Carte.getString();
String s3 = date_expjour.getString();
String s4 = date_expmois.getString();
String s5 = date_expannee.getString();
String s6 = code_Secret.getString();
String s7 = trois_chiff.getString();
String date_exp = s3 + s4 + s5;
String messageClair = s1 + ":" + s2 + ":" + date_exp + ":"+s6+ ":" + s7;
System.out.println("message à chiffrer " + messageClair);
BigInteger modulus1 = new BigInteger(1,Base64.decode(modulus));
BigInteger pubExp1 = new BigInteger(1,Base64.decode(publicExp));
RSAPublicKey= new RSAKeyParameters(false,modulus1,pubExp1)
byte[] messEnvoyeByte = null;
try {
messEnvoyeByte = theEncryption.RSAEncrypt(messageClair.getBytes(), RSAPublicKey);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String messageFinal= new String(Base64.encode(messEnvoyeByte));
sendSms = new SendSMS();
sendSms.setMessageEnv(messageFinal);
puis lorsque l'sms ARRIVE AU SERVEUR je construi le clé privé et je prend le contenu du sms ,je le decode puis je le decrypte :
//code coté serveur
String modulus = "AM8sVwRf8AnUjVpImOQuB5lKYDtzlHJMcQ0aRi2zFh2Jd+V0J8UhpIU1OnIBCj5SW1+L34hWqLmibFwv34XNxC0=";
String publicExp="AQAB";
String privateExp = "W8C2dTCMHb5uL/sRA5XDNcez4QCqUQi71OK7DAhRlhh8mn6eBuNKFRwrGBsoiX+jX2xWN45qsaRAokxsq/zqoQ==";
String p = "APOXRvd/v4SRQlR+pJxF3b5xbb7EQMjlrNNqAzLdnFJp";
String q = "ANm6IZOtNZfN3KcGxYgZLRWGdYB9fBY/Kq63uVX2NaMl";
String dp = "ANK/tmGZwBw1BPtPmqGt/NyxDG85Ioft1moPVXcjrwTJ";
String dq = "AItBtooaxeVzQQb/mMXkvGZBGtR07jHYcvdPAVaO5F2V";
String qInv = "G/c6jrV1a7m5f+I/qb1eZYVqvxloT6WSDz4QEYduAFQ=";
//construction de la clé privée
BigInteger modulus1 = new BigInteger(1,Base64.decode(modulus));
BigInteger pubExp1 = new BigInteger(1,Base64.decode(publicExp));
BigInteger privExp1 = new BigInteger(1,Base64.decode(privateExp));
BigInteger p1 = new BigInteger(1,Base64.decode(p));
BigInteger q1 = new BigInteger(1,Base64.decode(q));
BigInteger dp1 = new BigInteger(1,Base64.decode(dp));
BigInteger dq1 = new BigInteger(1,Base64.decode(dq));
BigInteger qInv1 = new BigInteger(1,Base64.decode(qInv));
RSAPrivateKey=new RSAPrivateCrtKeyParameters(modulus1,pubExp1,privExp1,p1,q1,dp1,dq1,qInv1);
//recuperation du contenu du sms puis decryptage
//messageChiffCode64: contenu du sms codé64
theEncryption= new Encryption();
byte[] messageChiffDecode64 = Base64.decode(messageChiffCode64);
String s= new String(messageChiffDecode64);
System.out.println("message decodé : " + s);
byte[] messageDecrypByte = theEncryption.RSADecrypt(messageChiffDecode64, RSAPrivateKey);
String messageDecrypFinal = new String(messageDecrypByte);
System.out
.println("Message Decrypté final : " + messageDecrypFinal);
le cryptage coté mobile marche trés bien mais quand je decrypte coté serveur lerreur suivante saffiche :
javax.servlet.ServletException: unknown block type
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
le code de la classe Encryption est le suivant:
public byte[] RSAEncrypt(byte[] toEncrypt,RSAKeyParameters RSAPublicKey) throws Exception {
if (RSAPublicKey == null) {
throw new Exception(
"Please generate RSA keys first in order to work");
}
AsymmetricBlockCipher theEngine = new RSAEngine();
theEngine = new PKCS1Encoding(theEngine);
theEngine.init(true, RSAPublicKey);
return theEngine.processBlock(toEncrypt, 0, toEncrypt.length);
}
public byte[] RSADecrypt(byte[] toDecrypt,RSAPrivateCrtKeyParameters RSAPrivateKey) throws Exception {
if (RSAPrivateKey == null) {
throw new Exception(
"Please generate RSA keys first in order to work");
}
AsymmetricBlockCipher theEngine = new RSAEngine();
theEngine = new PKCS1Encoding(theEngine);
theEngine.init(false, RSAPrivateKey);
return theEngine.processBlock(toDecrypt, 0, toDecrypt.length);
} |
Partager