背景
對接第三方金融支付系統接口,對方使用的是Java開發的,提供的Demo也是Java語言的。而公司使用的是PHP,所以需要將Demo中的加密轉化成PHP實現。
Java RSA分段加密
Java源碼
public class RSAUtils {
public static final String KEY_ALGORITHM = "RSA" ;
public static final String SIGNATURE_ALGORITHM = "MD5withRSA" ;
private static final int MAX_ENCRYPT_BLOCK = 117 ;
private static final int MAX_DECRYPT_BLOCK = 128 ;
public static Map< String, Object> genKeyPair ( ) throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator. getInstance ( KEY_ALGORITHM) ;
keyPairGen. initialize ( 1024 ) ;
KeyPair keyPair = keyPairGen. generateKeyPair ( ) ;
RSAPublicKey publicKey = ( RSAPublicKey) keyPair. getPublic ( ) ;
RSAPrivateKey privateKey = ( RSAPrivateKey) keyPair. getPrivate ( ) ;
Map< String, Object> keyMap = new HashMap < String, Object> ( 2 ) ;
keyMap. put ( PUBLIC_KEY, publicKey) ;
keyMap. put ( PRIVATE_KEY, privateKey) ;
return keyMap;
}
public static String sign ( byte [ ] data, String privateKey) throws Exception {
byte [ ] keyBytes = Base64. decodeBase64 ( privateKey) ;
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
PrivateKey privateK = keyFactory. generatePrivate ( pkcs8KeySpec) ;
Signature signature = Signature. getInstance ( SIGNATURE_ALGORITHM) ;
signature. initSign ( privateK) ;
signature. update ( data) ;
return Base64. encodeBase64String ( signature. sign ( ) ) ;
}
public static boolean verify ( byte [ ] data, String publicKey, String sign) throws Exception {
byte [ ] keyBytes = Base64. decodeBase64 ( publicKey) ;
X509EncodedKeySpec keySpec = new X509EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
PublicKey publicK = keyFactory. generatePublic ( keySpec) ;
Signature signature = Signature. getInstance ( SIGNATURE_ALGORITHM) ;
signature. initVerify ( publicK) ;
signature. update ( data) ;
return signature. verify ( Base64. decodeBase64 ( sign) ) ;
}
public static byte [ ] decryptByPrivateKey ( byte [ ] encryptedData, String privateKey) throws Exception {
byte [ ] keyBytes = Base64. decodeBase64 ( privateKey) ;
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
Key privateK = keyFactory. generatePrivate ( pkcs8KeySpec) ;
Cipher cipher = Cipher. getInstance ( keyFactory. getAlgorithm ( ) ) ;
cipher. init ( Cipher. DECRYPT_MODE, privateK) ;
int inputLen = encryptedData. length;
ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ;
int offSet = 0 ;
byte [ ] cache;
int i = 0 ;
while ( inputLen - offSet > 0 ) {
if ( inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher. doFinal ( encryptedData, offSet, MAX_DECRYPT_BLOCK) ;
} else {
cache = cipher. doFinal ( encryptedData, offSet, inputLen - offSet) ;
}
out. write ( cache, 0 , cache. length) ;
i++ ;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte [ ] decryptedData = out. toByteArray ( ) ;
out. close ( ) ;
return decryptedData;
}
public static String decryptByPublicKey ( String encryptedStr, String publicKey) throws Exception {
byte [ ] encryptedData = Base64. decodeBase64 ( encryptedStr) ;
System. out. println ( encryptedData. length) ;
byte [ ] keyBytes = Base64. decodeBase64 ( publicKey) ;
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
Key publicK = keyFactory. generatePublic ( x509KeySpec) ;
Cipher cipher = Cipher. getInstance ( keyFactory. getAlgorithm ( ) ) ;
cipher. init ( Cipher. DECRYPT_MODE, publicK) ;
int inputLen = encryptedData. length;
ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ;
int offSet = 0 ;
byte [ ] cache;
int i = 0 ;
while ( inputLen - offSet > 0 ) {
if ( inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher. doFinal ( encryptedData, offSet, MAX_DECRYPT_BLOCK) ;
} else {
cache = cipher. doFinal ( encryptedData, offSet, inputLen - offSet) ;
}
out. write ( cache, 0 , cache. length) ;
i++ ;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte [ ] decryptedData = out. toByteArray ( ) ;
out. close ( ) ;
return new String ( decryptedData) ;
}
public static byte [ ] encryptByPublicKey ( byte [ ] data, String publicKey) throws Exception {
byte [ ] keyBytes = Base64. decodeBase64 ( publicKey) ;
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
Key publicK = keyFactory. generatePublic ( x509KeySpec) ;
Cipher cipher = Cipher. getInstance ( keyFactory. getAlgorithm ( ) ) ;
cipher. init ( Cipher. ENCRYPT_MODE, publicK) ;
int inputLen = data. length;
ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ;
int offSet = 0 ;
byte [ ] cache;
int i = 0 ;
while ( inputLen - offSet > 0 ) {
if ( inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher. doFinal ( data, offSet, MAX_ENCRYPT_BLOCK) ;
} else {
cache = cipher. doFinal ( data, offSet, inputLen - offSet) ;
}
out. write ( cache, 0 , cache. length) ;
i++ ;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte [ ] encryptedData = out. toByteArray ( ) ;
out. close ( ) ;
return encryptedData;
}
public static String encryptByPrivateKey ( byte [ ] data, String privateKey) throws Exception {
byte [ ] keyBytes = Base64. decodeBase64 ( privateKey) ;
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec ( keyBytes) ;
KeyFactory keyFactory = KeyFactory. getInstance ( KEY_ALGORITHM) ;
Key privateK = keyFactory. generatePrivate ( pkcs8KeySpec) ;
Cipher cipher = Cipher. getInstance ( keyFactory. getAlgorithm ( ) ) ;
cipher. init ( Cipher. ENCRYPT_MODE, privateK) ;
int inputLen = data. length;
ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ;
int offSet = 0 ;
byte [ ] cache;
int i = 0 ;
while ( inputLen - offSet > 0 ) {
if ( inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher. doFinal ( data, offSet, MAX_ENCRYPT_BLOCK) ;
} else {
cache = cipher. doFinal ( data, offSet, inputLen - offSet) ;
}
out. write ( cache, 0 , cache. length) ;
i++ ;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte [ ] encryptedData = out. toByteArray ( ) ;
out. close ( ) ;
System. out. println ( encryptedData. length) ;
return Base64. encodeBase64String ( encryptedData) ;
}
public static String getPrivateKey ( Map< String, Object> keyMap) throws Exception {
Key key = ( Key) keyMap. get ( PRIVATE_KEY) ;
return Base64. encodeBase64String ( key. getEncoded ( ) ) ;
}
public static String getPublicKey ( Map< String, Object> keyMap) throws Exception {
Key key = ( Key) keyMap. get ( PUBLIC_KEY) ;
return Base64. encodeBase64String ( key. getEncoded ( ) ) ;
}
}
PHP實現RSA分段加密
分析源碼,發現RSA加密是使用分段加密,以下爲PHP的寫法
class RSA
{
public $privateKey = './rsa_private_key.pem' ;
public $publicKey = './rsa_public_key.pem' ;
public $pri_key = '' ;
public $pub_key = '' ;
public function __construct ( $publicKeyPath = null , $privateKeyPath = null , $publicKey = null , $privateKey = null ) {
if ( $this - > checkKeyFile ( $publicKeyPath ) ) {
$this - > pub_key = openssl_pkey_get_public ( file_get_contents ( $publicKeyPath ) ) ;
}
if ( $this - > checkKeyFile ( $privateKeyPath ) ) {
$this - > pri_key = openssl_pkey_get_private ( file_get_contents ( $privateKeyPath ) ) ;
}
if ( ! is_null ( $publicKey ) ) {
$this - > pub_key = openssl_pkey_get_public ( $this - > formatterPublicKey ( $publicKey ) ) ;
}
if ( ! is_null ( $privateKey ) ) {
$this - > pri_key = openssl_pkey_get_private ( $this - > formatterPrivateKey ( $privateKey ) ) ;
}
}
public function checkKeyFile ( $keyPath )
{
if ( ! is_null ( $keyPath ) ) {
if ( ! file_exists ( $keyPath ) ) {
throw new FileNotFoundException ( $keyPath ) ;
}
return true ;
}
return false ;
}
public function formatterPublicKey ( $publicKey )
{
if ( str_contains ( '-----BEGIN PUBLIC KEY-----' , $publicKey ) ) return $publicKey ;
$str = chunk_split ( $publicKey , 64 , PHP_EOL ) ;
$publicKey = "-----BEGIN PUBLIC KEY-----" . PHP_EOL . $str . "-----END PUBLIC KEY-----" ;
return $publicKey ;
}
public function formatterPrivateKey ( $privateKey )
{
if ( str_contains ( '-----BEGIN RSA PRIVATE KEY-----' , $privateKey ) ) return $privateKey ;
$str = chunk_split ( $privateKey , 64 , PHP_EOL ) ;
$privateKey = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL . $str . "-----END RSA PRIVATE KEY-----" ;
return $privateKey ;
}
public function encrypt ( $str ) {
$crypted = array ( ) ;
$data = $str ;
$dataArray = str_split ( $data , 117 ) ;
foreach ( $dataArray as $subData ) {
$subCrypted = null ;
openssl_private_encrypt ( $subData , $subCrypted , $this - > pri_key ) ;
$crypted [ ] = $subCrypted ;
}
$crypted = implode ( '' , $crypted ) ;
return base64_encode ( $crypted ) ;
}
public function decrypt ( $encryptstr ) {
$encryptstr = base64_decode ( $encryptstr ) ;
$decrypted = array ( ) ;
$dataArray = str_split ( $encryptstr , 128 ) ;
foreach ( $dataArray as $subData ) {
$subDecrypted = null ;
openssl_public_decrypt ( $subData , $subDecrypted , $this - > pub_key ) ;
$decrypted [ ] = $subDecrypted ;
}
$decrypted = implode ( '' , $decrypted ) ;
return $decrypted ;
}
}
校驗
生成rsa公鑰和私鑰
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUsGtqVZ5+EG1cWjSYP9bLnZhm
S93hThDjJPyC2oE51zTbXVeqTrJQTqeUQXfd03TGYP+CmgIpbsjn4PlmxMUu4YP3
D1xIlX4RfuDvt/bhpqGI5cQALNHa/mTAGI4mflyofH7nLQ+5kWBJK+6Qb6kG3ESA
8iWaSiG8qLXBbnV1XwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSwa2pVnn4QbVxa
NJg/1sudmGZL3eFOEOMk/ILagTnXNNtdV6pOslBOp5RBd93TdMZg/4KaAiluyOfg
+WbExS7hg/cPXEiVfhF+4O+39uGmoYjlxAAs0dr+ZMAYjiZ+XKh8fuctD7mRYEkr
7pBvqQbcRIDyJZpKIbyotcFudXVfAgMBAAECgYAJwJEcThK3Ww94pZY1yO+TZIWB
Y0coNoklsSN26If2W/zLdis33uXkMscSUDIr1K9NDVOJ7H/e4HqLz1AAO1ODLmFx
flnyeEIKan6M/4NA8/7IF+Wu0FDQjNm2iKW68axKiW01j6yqq2JagG9kff5xbkzx
riuWpmiDF0TWxzm6aQJBAPB2asI5dVr7bBC+sK7FjPQGNIu6X2NHeacHzUswSo7b
4NgTucAkubjLTgpd3s8/FQoVBm4Ay7Juzc0DBjVUv2UCQQDibpd6lzY0E9cNGol8
3HDKJGUTmnpduE9PKYua019vx/tgoMOK4squqnV74IY7NkhP5V0djO0XYxD0EaFn
mV9zAkAkp4hijuuqsMSqUMcR/R8dW4zK99/ufEi5A2Fx4qya1j2R8n/QIEkHOEZv
IhwCr3T/knDmd8yVKHrKk3lwy7hZAkEAlB7SGpCGFaUQ3XKJk9NEOQd700oPV/V0
dA1yVHKHEMFaMIiZweW/vmild8aVKHDG9vTMZ8NDaTQV6AMMeY+7/wJBANeLmqSH
flwpMA9BdyTxmuRv8W2lLKsjGDBDnVaKf4hBltMll/e3/OPkg/BPew3lxrHkp3E1
I6RyMTzmQxwXd78=
-----END PRIVATE KEY-----
編寫RSA分段加密Java Demo
編寫Java Demo
String key = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSwa2pVnn4QbVxaNJg/1sudmGZL3eFOEOMk/ILagTnXNNtdV6pOslBOp5RBd93TdMZg/4KaAiluyOfg+WbExS7hg/cPXEiVfhF+4O+39uGmoYjlxAAs0dr+ZMAYjiZ+XKh8fuctD7mRYEkr7pBvqQbcRIDyJZpKIbyotcFudXVfAgMBAAECgYAJwJEcThK3Ww94pZY1yO+TZIWBY0coNoklsSN26If2W/zLdis33uXkMscSUDIr1K9NDVOJ7H/e4HqLz1AAO1ODLmFxflnyeEIKan6M/4NA8/7IF+Wu0FDQjNm2iKW68axKiW01j6yqq2JagG9kff5xbkzxriuWpmiDF0TWxzm6aQJBAPB2asI5dVr7bBC+sK7FjPQGNIu6X2NHeacHzUswSo7b4NgTucAkubjLTgpd3s8/FQoVBm4Ay7Juzc0DBjVUv2UCQQDibpd6lzY0E9cNGol83HDKJGUTmnpduE9PKYua019vx/tgoMOK4squqnV74IY7NkhP5V0djO0XYxD0EaFnmV9zAkAkp4hijuuqsMSqUMcR/R8dW4zK99/ufEi5A2Fx4qya1j2R8n/QIEkHOEZvIhwCr3T/knDmd8yVKHrKk3lwy7hZAkEAlB7SGpCGFaUQ3XKJk9NEOQd700oPV/V0dA1yVHKHEMFaMIiZweW/vmild8aVKHDG9vTMZ8NDaTQV6AMMeY+7/wJBANeLmqSHflwpMA9BdyTxmuRv8W2lLKsjGDBDnVaKf4hBltMll/e3/OPkg/BPew3lxrHkp3E1I6RyMTzmQxwXd78=" ;
try {
JSONObject paramMap = new JSONObject ( ) ;
paramMap. put ( "name" , "張三" ) ;
paramMap. put ( "idNo" , "342422165897654326" ) ;
paramMap. put ( "phone" , "15256416396" ) ;
paramMap. put ( "inAcctNo" , "8239472342342342" ) ;
paramMap. put ( "inAcctBankName" , "平安銀行" ) ;
System. out. println ( paramMap. toString ( ) ) ;
String s = RSAUtils. encryptByPrivateKey ( paramMap. toString ( ) . getBytes ( ) , key) ;
System. out. println ( s) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
執行得到結果
{ "phone" : "15256416396" ,"name" : "張三" ,"inAcctNo" : "8239472342342342" ,"idNo" : "342422165897654326" ,"inAcctBankName" : "平安銀行" }
129
256
gEtyoaEc+eaoyUng/rCzr3u27nPf7M610oBS6DGT225tEhNmAn+BsGp2FMYdzzQsAJyLoanWGs10ScTsWu6aIs2vUb1Eknm6q7EOhik5ISWjWemL+VYOOqLdtskNEL+LvUo4uVjd9pkCQtGQvNxmM8uhSZQ1o3b4q0vpcP/h6+UaQlQArKxEd2oophqEdP57I30sc9ICd0E8o6qIp4jHqDUiig+xyHFMBOnhbt/9Lc+IlEjENWs23XAZCilC0rlBfHVf3avB9on4t6ExpmKMrRV0Ojn6KjsBcsdnVpNGsERljsW05GK+A+1R++yYCDkmG6UDJxUq0i54fbw2+rLu0g==
編寫RSA分段加密PHP Demo
PHP Demo源碼
$privateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANSwa2pVnn4QbVxaNJg/1sudmGZL3eFOEOMk/ILagTnXNNtdV6pOslBOp5RBd93TdMZg/4KaAiluyOfg+WbExS7hg/cPXEiVfhF+4O+39uGmoYjlxAAs0dr+ZMAYjiZ+XKh8fuctD7mRYEkr7pBvqQbcRIDyJZpKIbyotcFudXVfAgMBAAECgYAJwJEcThK3Ww94pZY1yO+TZIWBY0coNoklsSN26If2W/zLdis33uXkMscSUDIr1K9NDVOJ7H/e4HqLz1AAO1ODLmFxflnyeEIKan6M/4NA8/7IF+Wu0FDQjNm2iKW68axKiW01j6yqq2JagG9kff5xbkzxriuWpmiDF0TWxzm6aQJBAPB2asI5dVr7bBC+sK7FjPQGNIu6X2NHeacHzUswSo7b4NgTucAkubjLTgpd3s8/FQoVBm4Ay7Juzc0DBjVUv2UCQQDibpd6lzY0E9cNGol83HDKJGUTmnpduE9PKYua019vx/tgoMOK4squqnV74IY7NkhP5V0djO0XYxD0EaFnmV9zAkAkp4hijuuqsMSqUMcR/R8dW4zK99/ufEi5A2Fx4qya1j2R8n/QIEkHOEZvIhwCr3T/knDmd8yVKHrKk3lwy7hZAkEAlB7SGpCGFaUQ3XKJk9NEOQd700oPV/V0dA1yVHKHEMFaMIiZweW/vmild8aVKHDG9vTMZ8NDaTQV6AMMeY+7/wJBANeLmqSHflwpMA9BdyTxmuRv8W2lLKsjGDBDnVaKf4hBltMll/e3/OPkg/BPew3lxrHkp3E1I6RyMTzmQxwXd78=' ;
$rsa = new RSA ( null , null , null , $privateKey ) ;
$string = '{"phone":"15256416396","name":"張三","inAcctNo":"8239472342342342","idNo":"342422165897654326","inAcctBankName":"平安銀行"}' ;
$encryptstr = $rsa - > encrypt ( $string ) ;
echo $encryptstr ;
運行,得到結果,和Java代碼執行的結果一致,所以兩個結果是一樣的
gEtyoaEc+eaoyUng/rCzr3u27nPf7M610oBS6DGT225tEhNmAn+BsGp2FMYdzzQsAJyLoanWGs10ScTsWu6aIs2vUb1Eknm6q7EOhik5ISWjWemL+VYOOqLdtskNEL+LvUo4uVjd9pkCQtGQvNxmM8uhSZQ1o3b4q0vpcP/h6+UaQlQArKxEd2oophqEdP57I30sc9ICd0E8o6qIp4jHqDUiig+xyHFMBOnhbt/9Lc+IlEjENWs23XAZCilC0rlBfHVf3avB9on4t6ExpmKMrRV0Ojn6KjsBcsdnVpNGsERljsW05GK+A+1R++yYCDkmG6UDJxUq0i54fbw2+rLu0g==
編寫Java RSA分段解密Demo
Java Demo
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUsGtqVZ5+EG1cWjSYP9bLnZhmS93hThDjJPyC2oE51zTbXVeqTrJQTqeUQXfd03TGYP+CmgIpbsjn4PlmxMUu4YP3D1xIlX4RfuDvt/bhpqGI5cQALNHa/mTAGI4mflyofH7nLQ+5kWBJK+6Qb6kG3ESA8iWaSiG8qLXBbnV1XwIDAQAB" ;
String input = "gEtyoaEc+eaoyUng/rCzr3u27nPf7M610oBS6DGT225tEhNmAn+BsGp2FMYdzzQsAJyLoanWGs10ScTsWu6aIs2vUb1Eknm6q7EOhik5ISWjWemL+VYOOqLdtskNEL+LvUo4uVjd9pkCQtGQvNxmM8uhSZQ1o3b4q0vpcP/h6+UaQlQArKxEd2oophqEdP57I30sc9ICd0E8o6qIp4jHqDUiig+xyHFMBOnhbt/9Lc+IlEjENWs23XAZCilC0rlBfHVf3avB9on4t6ExpmKMrRV0Ojn6KjsBcsdnVpNGsERljsW05GK+A+1R++yYCDkmG6UDJxUq0i54fbw2+rLu0g==" ;
String result = null;
try {
result = RSAUtils. decryptByPublicKey ( input, publicKey) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
System. out. println ( result) ;
輸出結果
{ "phone" : "15256416396" , "name" : "張三" , "inAcctNo" : "8239472342342342" , "idNo" : "342422165897654326" , "inAcctBankName" : "平安銀行" }
編寫PHP RSA分段解密DEMO
PHP Demo
$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDUsGtqVZ5+EG1cWjSYP9bLnZhmS93hThDjJPyC2oE51zTbXVeqTrJQTqeUQXfd03TGYP+CmgIpbsjn4PlmxMUu4YP3D1xIlX4RfuDvt/bhpqGI5cQALNHa/mTAGI4mflyofH7nLQ+5kWBJK+6Qb6kG3ESA8iWaSiG8qLXBbnV1XwIDAQAB' ;
$rsa = new RSA ( null , null , $publicKey ) ;
$inputStr = 'gEtyoaEc+eaoyUng/rCzr3u27nPf7M610oBS6DGT225tEhNmAn+BsGp2FMYdzzQsAJyLoanWGs10ScTsWu6aIs2vUb1Eknm6q7EOhik5ISWjWemL+VYOOqLdtskNEL+LvUo4uVjd9pkCQtGQvNxmM8uhSZQ1o3b4q0vpcP/h6+UaQlQArKxEd2oophqEdP57I30sc9ICd0E8o6qIp4jHqDUiig+xyHFMBOnhbt/9Lc+IlEjENWs23XAZCilC0rlBfHVf3avB9on4t6ExpmKMrRV0Ojn6KjsBcsdnVpNGsERljsW05GK+A+1R++yYCDkmG6UDJxUq0i54fbw2+rLu0g==' ;
$result = $rsa - > decrypt ( $inputStr ) ;
echo $result ;
輸出結果
{ "phone" : "15256416396" , "name" : "張三" , "inAcctNo" : "8239472342342342" , "idNo" : "342422165897654326" , "inAcctBankName" : "平安銀行" }