Edited at

processing(android mode)でKeyStoreの作成とapkの署名(一部変更すればjavaでもOK)


目的

processingで署名する

IDEの作成とかに使えるかも(IDE作ってる人はこんなの見ないでも作れそうだけど…)


library

ZipSignerとSpongyCastleを導入しといてください


import

import java.security.KeyStore;

import java.io.*;
import android.os.Environment;
import javax.crypto.SecretKey;
import javax.crypto.KeyGenerator;
import kellinwood.security.zipsigner.ZipSigner;
import java.io.InputStream;
import kellinwood.security.zipsigner.optional.CustomKeySigner;
import org.spongycastle.jce.provider.BouncyCastleProvider;
import java.net.*;


権限

processingなら

if (!hasPermission("android.permission.WRITE_EXTERNAL_STORAGE"))requestPermission("android.permission.WRITE_EXTERNAL_STORAGE", "initLocation");

でできます

javaなら勝手にWRITE_EXTERNAL_STORAGE追加してください


Keystoreの作成

KeyStore ks;

void createKey(String keyName,String keyPassword,String Alias,String AliasPassword){
try{
String directory=Environment.getExternalStorageDirectory()+"/"+keyName+"."+KeyStore.getDefaultType();
ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, keyPassword.toCharArray());
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey mySecretKey=keyGen.generateKey();
KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey);
ks.setEntry(Alias, skEntry, new KeyStore.PasswordProtection(AliasPassword.toCharArray()));
File file=new File(directory);
FileOutputStream fos = new FileOutputStream(file);
    ks.store(fos, keyPassword.toCharArray());
}catch(Exception e){
e.printStackTrace();
}
}

でいける


署名

void sign(String keystore,String keystorePassword,String keyAlias,String StringkeyAliasPassword,String inFilename,String outputFilename){

try {
ZipSigner signer = new ZipSigner();
CustomKeySigner.signZip(signer, keystore, keystorePassword.toCharArray(), keyAlias, keyAliasPassword.toCharArray(), "SHA1WITHRSA", inFilename, outputFilename);
}catch (Exception e) {
    e.printStackTrace();
}
}

でいける


あとがき

日本語の解説が少ないから手間取ったがやること自体は単純だった