2016-07-22 33 views
5

BouncyCastle lib. Codenameone kullanarak bir ISO-0 pinblock şifrelemeye çalışıyorum.Veri bloğu boyutu codenameone içinde hizalanmış değil BouncyCastle (Dolgu Yok)

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; 
} 

örneğin ölçüm sonuçları elde etmek için:

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 olarak aşağıdaki gibidir: bu ulaşmak için kullanımı yöntem olup

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

bir public static void main yöntemi ile bu çalıştırın Ancak, bu Android için Codenameone aracılığıyla inşa ettiğimde, beklendiği gibi çalışıyor, ben logcat aşağıdaki hata olsun:

Yastıklı pinbobun uzunluğu 16 olmasına rağmen (8'in katları).

Bu konuyla ilgili herhangi bir yardım memnuniyetle karşılanacaktır.

cevap

2

Şifreleme ikili verilerine çalışır ve sizin pinblock ikili, yani o şekilde tutun.

performEncrypt(..) arayarak

Eğer new String(ByteUtil.hex2byte(padded)) ile bir dizeye sizin onaltılık kodlanmış pinblock dönüştürmek ve performEncrypt(...) içeride sen byte[] ptBytes = plainText.getBytes(); ile bir bayt dizisi dönüştürün.

: vb take a look here

Eğer performEncrypt(..) ila imzanızı değiştirin

bu sorun değil tüm bayt dizileri doğru ileri geri bir dize ile eşlenebilir olması ve farklı veri ve hatta farklı uzunlukta sonunda olabilir

private static byte[] performEncrypt(byte[] key, byte[] plainText, boolean padding) { 

ve bir dizgeden tamamen dönüştürmekten kaçının.

+0

Harika cevap. Codename One'da Strings'i yerel Dizeleriyle eşleştirirken, Strings'i kullanmak için kullanmaktan kaçınıyorum. iOS'ta ve bazı aşırı uç durumlarda hafif davranışsal tutarsızlıklar olabilir. Örneğin. https://www.codenameone.com/blog/zip-and-toast.html zip desteğini entegre ederken bir sorun yaşadık –