2016-07-22 8 views
5

codenameone BouncyCastle libを使用してISO-0ピンブロックを暗号化しようとしています。ブロック名がcodenameoneに揃っていないBouncyCastle(パディングなし)

public static StringBuilder pad(String data, char padCharacter, int multiplier) { 
    StringBuilder text = new StringBuilder(); 
    text.append(data); 
    while (text.length() % multiplier != 0) { 
     text.append(padCharacter); 
    } 
    return text; 
} 

は、例えば、ログ出力を与えるために:

private static byte[] performEncrypt(byte[] key, String plainText, boolean padding) { 
    byte[] ptBytes = plainText.getBytes(); 

    BufferedBlockCipher cipher; 
    if (padding) { 
     cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine())); 
    } else { 
     cipher = new BufferedBlockCipher(new CBCBlockCipher(new DESedeEngine())); 
    } 
    cipher.init(true, new KeyParameter(key)); 
    byte[] rv = new byte[cipher.getOutputSize(ptBytes.length)]; 
    int oLen = cipher.processBytes(ptBytes, 0, ptBytes.length, rv, 0); 
    try { 
     cipher.doFinal(rv, oLen); 
    } catch (CryptoException ce) { 
     LoggingUtil.error(TAG, ce, "Unexpected Exception"); 
    } 
    return rv; 
} 

private static String createIso0PinBlock(String pin, String number) { 
    ... 
} 

private static String getPaddedData(String data, byte padCharacter) { 
    String paddedData = ByteUtil.pad(data, (char) padCharacter, 8).toString(); 
    return paddedData; 
} 

public static String createPinBlockAndEncrypt(String pin, String number) { 
    LoggingUtil.debug("SecurityUtil", "CREAT PIN BLOCK AND ENCRYPT.. PIN: " + pin + " NUMBER: " + number); 
    String pb = createIso0PinBlock(pin, number.substring(0, number.length() - 1)); 
    LoggingUtil.debug("SecurityUtil", "PINBLOCK: " + pb); 
    String padded = getPaddedData(pb, (byte) 0x00); 
    LoggingUtil.debug("SecurityUtil", "PADDED: " + padded); 
    byte[] encrypted = performEncrypt(Hex.decode(KEY.getBytes()), new String(ByteUtil.hex2byte(padded)), false); 
    return ByteUtil.byte2hex(encrypted); 
} 

ByteUtilでは次のように私はこれを達成するために使用 方法がある

[SecurityUtil] CREAT PIN BLOCK AND ENCRYPT.. PIN: 2255 NUMBER: 6284734104205417486 
[SecurityUtil] PINBLOCK: 042214FBDFABE8B7 
[SecurityUtil] PADDED: 042214FBDFABE8B7 

Iはpublic static void main方法を介してこれを実行するとそれは期待どおりに動作しますが、私がCodenameone経由でAndroid用にビルドすると、logcatで次のエラーが発生します。

パディングされたピンブロックの長さが16(8の倍数)にもかかわらずです。

この問題に関するお手伝いをいただければ幸いです。

答えて

2

暗号化は、バイナリデータ上で動作し、あなたのpinblockはバイナリあるので、そのように保ちます。

performEncrypt(..)を呼び出すときに、あなたの進エンコードpinblockがnew String(ByteUtil.hex2byte(padded))で文字列に変換し、performEncrypt(...)の内側にあなたがbyte[] ptBytes = plainText.getBytes();をバイト配列に変換します。

:これで問題がにあなた performEncrypt(..)のあなたの署名を変更

などtake a look here

ない全てのバイト列は、文字列を前後に正確にマッピングすることができ、あなたが別のデータで終わるかもしれないということであるとさえ異なる長さ
private static byte[] performEncrypt(byte[] key, byte[] plainText, boolean padding) { 

文字列全体の変換は避けてください。

+0

偉大な答え。 StringsをネイティブStringにマップするときに、Codename OneでバイナリデータにStringを使用することは避けます。 iOSでは、いくつかの極端なケースではわずかな動作の不一致が生じる可能性があります。例えば。 zipサポートを統合する際に問題が発生しました。https://www.codenameone.com/blog/zip-and-toast.html –

関連する問題