Overgram/lib/src/main/java/io/github/lonamiwebs/overgram/utils/RSA.java

51 lines
4.2 KiB
Java

package io.github.lonamiwebs.overgram.utils;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import java.math.BigInteger;
public class RSA {
// TODO Load keys from "-----BEGIN RSA PUBLIC KEY-----" properely
public final BigInteger n;
public final BigInteger e;
private RSA(final BigInteger n, final BigInteger e) {
this.n = n;
this.e = e;
}
private static RSA getKey(final long fingerprint) {
// Java can't into switch(long) apparently
if (fingerprint == -7306692244673891685L) {
return new RSA(new BigInteger("25081407810410225030931722734886059247598515157516470397242545867550116598436968553551465554653745201634977779380884774534457386795922003815072071558370597290368737862981871277312823942822144802509055492512145589734772907225259038113414940384446493111736999668652848440655603157665903721517224934142301456312994547591626081517162758808439979745328030376796953660042629868902013177751703385501412640560275067171555763725421377065095231095517201241069856888933358280729674273422117201596511978645878544308102076746465468955910659145532699238576978901011112475698963666091510778777356966351191806495199073754705289253783"), new BigInteger("65537"));
} else if (fingerprint == -5738946642031285640L) {
return new RSA(new BigInteger("22347337644621997830323797217583448833849627595286505527328214795712874535417149457567295215523199212899872122674023936713124024124676488204889357563104452250187725437815819680799441376434162907889288526863223004380906766451781702435861040049293189979755757428366240570457372226323943522935844086838355728767565415115131238950994049041950699006558441163206523696546297006014416576123345545601004508537089192869558480948139679182328810531942418921113328804749485349441503927570568778905918696883174575510385552845625481490900659718413892216221539684717773483326240872061786759868040623935592404144262688161923519030977"), new BigInteger("65537"));
} else if (fingerprint == -4344800451088585951L) {
return new RSA(new BigInteger("24403446649145068056824081744112065346446136066297307473868293895086332508101251964919587745984311372853053253457835208829824428441874946556659953519213382748319518214765985662663680818277989736779506318868003755216402538945900388706898101286548187286716959100102939636333452457308619454821845196109544157601096359148241435922125602449263164512290854366930013825808102403072317738266383237191313714482187326643144603633877219028262697593882410403273959074350849923041765639673335775605842311578109726403165298875058941765362622936097839775380070572921007586266115476975819175319995527916042178582540628652481530373407"), new BigInteger("65537"));
} else if (fingerprint == 8205599988028290019L) {
return new RSA(new BigInteger("24573455207957565047870011785254215390918912369814947541785386299516827003508659346069416840622922416779652050319196701077275060353178142796963682024347858398319926119639265555410256455471016400261630917813337515247954638555325280392998950756512879748873422896798579889820248358636937659872379948616822902110696986481638776226860777480684653756042166610633513404129518040549077551227082262066602286208338952016035637334787564972991208252928951876463555456715923743181359826124083963758009484867346318483872552977652588089928761806897223231500970500186019991032176060579816348322451864584743414550721639495547636008351"), new BigInteger("65537"));
} else {
return null;
}
}
public static byte[] encrypt(final long fingerprint, final byte[] data) throws SecurityException {
final RSA key = getKey(fingerprint);
if (key == null) {
return null;
}
final ByteOutputStream toEncrypt = new ByteOutputStream(256);
toEncrypt.write(0); // big endian unsigned big integer needs the sign bit 0
toEncrypt.write(Utils.sha1digest(data)); // 20 bytes
toEncrypt.write(data); // length
toEncrypt.write(Utils.randomBytes(235 - data.length)); // left random padding
final BigInteger payload = new BigInteger(toEncrypt.getBytes());
final BigInteger encrypted = payload.modPow(key.e, key.n);
return encrypted.toByteArray();
}
}