H2H

Как зашифровать номер карты

При проведении выплат по номеру карты в поле pan необходимо передавать токен номера карты. Для этого номер карты необходимо зашифровать с помощью алгоритма RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING открытым ключом:

Примеры шифрования
Python с использованием Crypto.Cipher в PyCryptodome
1import sys
2from Crypto.Hash import SHA256, SHA1
3from Crypto.PublicKey import RSA
4from Crypto.Cipher import PKCS1_OAEP
5from base64 import b64decode, b64encode
6from Crypto.Signature import pss
7pubkey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwj9k2lFfc/EE2zYdRoRLZF5B42V6n8OHKfxLBLMk/0qpP2ZEYYoCqgbD9xsmLbQMTCxQ8JWj/V08JGpFjuNKJ2hRfRzLUfjTm5ReZJVPDhJa4B0QtUEvCS2R4aMqMpnQ1a1aywGAJoM5ift0apCNGKuZZYrGuFkQXeBw85lSYYNwrVmNUm55RI+tcb'
8msg = "4779642610000010"
9keyDER = b64decode(pubkey)
10keyPub = RSA.importKey(keyDER)
11cipher = PKCS1_OAEP.new(keyPub, SHA256, mgfunc=lambda x,y: pss.MGF1(x,y, SHA1))
12cipher_text = cipher.encrypt(msg.encode())
13encodedCard = b64encode(cipher_text)
14sys.stdout.buffer.write(encodedCard)
C# с использованием библиотеки Chilkat .NET for the 4.8.* Frameworks
1Chilkat.Rsa rsa = new Chilkat.Rsa();
2Chilkat.PublicKey pubkey = new Chilkat.PublicKey();
3pubkey.LoadFromFile("C://cardbankkey-sandbox.pub");
4string cardNumber = "4779642610000010";
5rsa.ImportPublicKeyObj(pubkey);
6rsa.OaepPadding = true;
7rsa.OaepHash = "sha256";
8string encCard = rsa.EncryptStringENC(cardNumber, false);
9Console.WriteLine(encCard);
Java с базовыми библиотеками crypto
1import lombok.SneakyThrows;
2import ru.alfabank.csp.api.decryptor.properties.CryptoServiceProperties;
3import javax.crypto.Cipher;
4import java.security.KeyStore;
5import java.security.KeyStoreException;
6import java.security.PublicKey;
7public class CryptoServiceImpl {
8    private KeyStore keyStore;
9    private CryptoServiceProperties properties;
10    private PublicKey getPublicKey() throws KeyStoreException {
11        return keyStore.getCertificate(properties.getAlias()).getPublicKey();
12    }
13    @SneakyThrows
14    public byte[] encrypt(byte[] data) {
15        var rsaCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
16        rsaCipher.init(Cipher.ENCRYPT_MODE, getPublicKey());
17        return rsaCipher.doFinal(data);
18    }
19}
PHP
1public function createCypher(string $pan): FunctionResult {
2    $publicKey = PublicKeyLoader::load(file_get_contents($this->cardBankKey));
3    $algo = $publicKey->withPadding(RSA::ENCRYPTION_OAEP)->withHash('sha256')->withMGFHash('sha1');
4    return FunctionResult::success(base64_encode($algo->encrypt($pan)));
5}