├── Itaucripto.php ├── README.md ├── documentação Itaú ├── ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf ├── Itaucripto.class └── Itaucripto.java ├── documentação Itaú ├── ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf ├── Itaucripto.class └── Itaucripto.java └── teste.php /Itaucripto.php: -------------------------------------------------------------------------------- 1 | sbox = array(); 27 | $this->key = array(); 28 | 29 | $this->numPed = ""; 30 | $this->tipPag = ""; 31 | $this->codEmp = ""; 32 | } 33 | 34 | //$dados, $chave 35 | private function Algoritmo($paramString1, $paramString2) 36 | { 37 | $paramString2 = strtoupper($paramString2); 38 | 39 | $k = 0; 40 | $m = 0; 41 | 42 | $str = ""; 43 | $this->Inicializa($paramString2); 44 | 45 | for ($j = 1; $j <= strlen($paramString1); $j++) { 46 | $k = ($k + 1) % 256; 47 | $m = ($m + $this->sbox[$k]) % 256; 48 | $i = $this->sbox[$k]; 49 | $this->sbox[$k] = $this->sbox[$m]; 50 | $this->sbox[$m] = $i; 51 | 52 | $n = $this->sbox[(($this->sbox[$k] + $this->sbox[$m]) % 256)]; 53 | 54 | $i1 = (ord(substr($paramString1, ($j - 1), 1)) ^ $n); 55 | 56 | $str = $str . chr($i1); 57 | } 58 | 59 | return $str; 60 | } 61 | 62 | private function PreencheBranco($paramString, $paramInt) 63 | { 64 | $str = $paramString . ""; 65 | 66 | while (strlen($str) < $paramInt) { 67 | $str = $str . " "; 68 | } 69 | 70 | return substr($str, 0, $paramInt); 71 | } 72 | 73 | private function PreencheZero($paramString, $paramInt) 74 | { 75 | $str = $paramString . ""; 76 | 77 | while (strlen($str) < $paramInt) { 78 | $str = "0" . $str; 79 | } 80 | 81 | return substr($str, 0, $paramInt); 82 | } 83 | 84 | private function Inicializa($paramString) 85 | { 86 | $m = strlen($paramString); 87 | 88 | for ($j = 0; $j <= 255; $j++) { 89 | $this->key[$j] = substr($paramString, ($j % $m), 1); 90 | $this->sbox[$j] = $j; 91 | } 92 | 93 | $k = 0; 94 | 95 | for ($j = 0; $j <= 255; $j++) { 96 | $k = ($k + $this->sbox[$j] + ord($this->key[$j])) % 256; 97 | $i = $this->sbox[$j]; 98 | $this->sbox[$j] = $this->sbox[$k]; 99 | $this->sbox[$k] = $i; 100 | } 101 | } 102 | 103 | //Função criada para substituir o Math.random() do Java 104 | //Retorna um número entre 0.0 e 0.9999999999 (equivalente ao Double do Java, mas com menor precisão) 105 | private function JavaRandom() 106 | { 107 | return rand(0, 999999999) / 1000000000; 108 | } 109 | 110 | //Retira as letras acentuadas e substitui pelas não acentuadas 111 | private function TiraAcento($str) 112 | { 113 | return strtr(utf8_decode($str),utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'); 114 | } 115 | 116 | private function Converte($paramString) 117 | { 118 | $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); 119 | $str = "" . $c; 120 | 121 | for ($i = 0; $i < strlen($paramString); $i++) { 122 | $k = substr($paramString, $i, 1); 123 | $j = ord($k); 124 | $str = $str . $j; 125 | $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); 126 | $str = $str . $c; 127 | } 128 | 129 | return $str; 130 | } 131 | 132 | private function Desconverte($paramString) 133 | { 134 | $str1 = ""; 135 | 136 | for ($i = 0; $i < strlen($paramString); $i++) { 137 | $str2 = ""; 138 | 139 | $c = substr($paramString, $i, 1); 140 | 141 | while (is_numeric($c)) { 142 | $str2 = $str2 . substr($paramString, $i, 1); 143 | $i += 1; 144 | $c = substr($paramString, $i, 1); 145 | } 146 | 147 | if ($str2 != "") { 148 | $j = $str2 + 0; 149 | $str1 = $str1 . chr($j); 150 | } 151 | } 152 | 153 | return $str1; 154 | } 155 | 156 | //$codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3 157 | public function geraDados($paramString1, $paramString2, $paramString3, $paramString4, $paramString5, $paramString6, $paramString7, $paramString8, $paramString9, $paramString10, $paramString11, $paramString12, $paramString13, $paramString14, $paramString15, $paramString16, $paramString17, $paramString18) 158 | { 159 | $paramString1 = strtoupper($paramString1); 160 | $paramString5 = strtoupper($paramString5); 161 | 162 | if (strlen($paramString1) != $this->TAM_COD_EMP) { 163 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 164 | } 165 | 166 | if (strlen($paramString5) != $this->TAM_CHAVE) { 167 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 168 | } 169 | 170 | if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { 171 | return "Erro: número do pedido inválido."; 172 | } 173 | 174 | if (is_numeric($paramString2)) { 175 | $paramString2 = $this->PreencheZero($paramString2, 8); 176 | } else { 177 | return "Erro: numero do pedido não é numérico."; 178 | } 179 | 180 | if ((strlen($paramString3) < 1) || (strlen($paramString3) > 11)) { 181 | return "Erro: valor da compra inválido."; 182 | } 183 | 184 | $i = strpos($paramString3, ','); 185 | 186 | if ($i !== FALSE) { 187 | $str3 = substr($paramString3, ($i + 1)); 188 | 189 | if (!is_numeric($str3)) { 190 | return "Erro: valor decimal não é numérico."; 191 | } 192 | 193 | if (strlen($str3) != 2) { 194 | return "Erro: valor decimal da compra deve possuir 2 posições após a virgula."; 195 | } 196 | 197 | $paramString3 = substr($paramString3, 0, strlen($paramString3) - 3) . $str3; 198 | } else { 199 | if (!is_numeric($paramString3)) { 200 | return "Erro: valor da compra não é numérico."; 201 | } 202 | 203 | if (strlen($paramString3) > 8) { 204 | return "Erro: valor da compra deve possuir no máximo 8 posições antes da virgula."; 205 | } 206 | 207 | $paramString3 = $paramString3 . "00"; 208 | } 209 | 210 | $paramString3 = $this->PreencheZero($paramString3, 10); 211 | 212 | $paramString7 = trim($paramString7); 213 | 214 | if (($paramString7 != "02") && ($paramString7 != "01") && ($paramString7 != "")) { 215 | return "Erro: código de inscrição inválido."; 216 | } 217 | 218 | if (($paramString8 != "") && (!is_numeric($paramString8)) && (strlen($paramString8) > 14)) { 219 | return "Erro: número de inscrição inválido."; 220 | } 221 | 222 | if (($paramString11 != "") && ((!is_numeric($paramString11)) || (strlen($paramString11) != 8))) { 223 | return "Erro: cep inválido."; 224 | } 225 | 226 | if (($paramString14 != "") && ((!is_numeric($paramString14)) || (strlen($paramString14) != 8))) { 227 | return "Erro: data de vencimento inválida."; 228 | } 229 | 230 | if (strlen($paramString16) > 60) { 231 | return "Erro: observação adicional 1 inválida."; 232 | } 233 | 234 | if (strlen($paramString17) > 60) { 235 | return "Erro: observação adicional 2 inválida."; 236 | } 237 | 238 | if (strlen($paramString18) > 60) { 239 | return "Erro: observação adicional 3 inválida."; 240 | } 241 | 242 | //Retira os acentos 243 | $paramString4 = $this->TiraAcento($paramString4); 244 | $paramString6 = $this->TiraAcento($paramString6); 245 | $paramString9 = $this->TiraAcento($paramString9); 246 | $paramString10 = $this->TiraAcento($paramString10); 247 | $paramString12 = $this->TiraAcento($paramString12); 248 | $paramString16 = $this->TiraAcento($paramString16); 249 | $paramString17 = $this->TiraAcento($paramString17); 250 | $paramString18 = $this->TiraAcento($paramString18); 251 | 252 | $paramString4 = $this->PreencheBranco($paramString4, 40); 253 | $paramString6 = $this->PreencheBranco($paramString6, 30); 254 | $paramString7 = $this->PreencheBranco($paramString7, 2); 255 | $paramString8 = $this->PreencheBranco($paramString8, 14); 256 | $paramString9 = $this->PreencheBranco($paramString9, 40); 257 | $paramString10 = $this->PreencheBranco($paramString10, 15); 258 | $paramString11 = $this->PreencheBranco($paramString11, 8); 259 | $paramString12 = $this->PreencheBranco($paramString12, 15); 260 | $paramString13 = $this->PreencheBranco($paramString13, 2); 261 | $paramString14 = $this->PreencheBranco($paramString14, 8); 262 | $paramString15 = $this->PreencheBranco($paramString15, 60); 263 | $paramString16 = $this->PreencheBranco($paramString16, 60); 264 | $paramString17 = $this->PreencheBranco($paramString17, 60); 265 | $paramString18 = $this->PreencheBranco($paramString18, 60); 266 | 267 | $str1 = $this->Algoritmo($paramString2 . $paramString3 . $paramString4 . $paramString6 . $paramString7 . $paramString8 . $paramString9 . $paramString10 . $paramString11 . $paramString12 . $paramString13 . $paramString14 . $paramString15 . $paramString16 . $paramString17 . $paramString18, $paramString5); 268 | 269 | $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); 270 | 271 | return $this->Converte($str2); 272 | } 273 | 274 | public function geraCripto($paramString1, $paramString2, $paramString3) 275 | { 276 | if (strlen($paramString1) != $this->TAM_COD_EMP) { 277 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 278 | } 279 | 280 | if (strlen($paramString3) != $this->TAM_CHAVE) { 281 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 282 | } 283 | 284 | $paramString2 = trim($paramString2); 285 | 286 | if ($paramString2 == "") { 287 | return "Erro: código do sacado inválido."; 288 | } 289 | 290 | $str1 = $this->Algoritmo($paramString2, $paramString3); 291 | 292 | $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); 293 | 294 | return $this->Converte($str2); 295 | } 296 | 297 | public function geraConsulta($paramString1, $paramString2, $paramString3, $paramString4) 298 | { 299 | if (strlen($paramString1) != $this->TAM_COD_EMP) { 300 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 301 | } 302 | 303 | if (strlen($paramString4) != $this->TAM_CHAVE) { 304 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 305 | } 306 | 307 | if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { 308 | return "Erro: número do pedido inválido."; 309 | } 310 | 311 | if (is_numeric($paramString2)) { 312 | $paramString2 = $this->PreencheZero($paramString2, 8); 313 | } else { 314 | return "Erro: numero do pedido não é numérico."; 315 | } 316 | 317 | if (($paramString3 != "0") && ($paramString3 != "1")) { 318 | return "Erro: formato inválido."; 319 | } 320 | 321 | $str1 = $this->Algoritmo($paramString2 . $paramString3, $paramString4); 322 | 323 | $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); 324 | 325 | return $this->Converte($str2); 326 | } 327 | 328 | //$dados, $chave 329 | public function decripto($paramString1, $paramString2) 330 | { 331 | //A chave precisa sempre estar em maiusculo 332 | $paramString2 = strtoupper($paramString2); 333 | 334 | $paramString1 = $this->Desconverte($paramString1); 335 | 336 | $str = $this->Algoritmo($paramString1, $paramString2); 337 | 338 | $this->codEmp = substr($str, 0, 26); 339 | 340 | $this->numPed = substr($str, 26, 8); 341 | 342 | $this->tipPag = substr($str, 34, 2); 343 | 344 | return $str; 345 | } 346 | 347 | public function retornaCodEmp() 348 | { 349 | return $this->codEmp; 350 | } 351 | 352 | public function retornaPedido() 353 | { 354 | return $this->numPed; 355 | } 356 | 357 | public function retornaTipPag() 358 | { 359 | return $this->tipPag; 360 | } 361 | 362 | public function geraDadosGenerico($paramString1, $paramString2, $paramString3) 363 | { 364 | $paramString1 = strtoupper($paramString1); 365 | $paramString3 = strtoupper($paramString3); 366 | 367 | if (strlen($paramString1) != $this->TAM_COD_EMP) 368 | { 369 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 370 | } 371 | 372 | if (strlen($paramString3) != $this->TAM_CHAVE) 373 | { 374 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 375 | } 376 | 377 | if (strlen($paramString2) < 1) 378 | { 379 | return "Erro: sem dados."; 380 | } 381 | 382 | $str1 = $this->Algoritmo($paramString2, $paramString3); 383 | 384 | $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); 385 | 386 | return $this->Converte($str2); 387 | } 388 | } 389 | 390 | ?> -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PHP ITAUCRIPTO 2 | ============== 3 | 4 | Versão em PHP da classe Itaucripto, originalmente escrita em Java. 5 | 6 | O nome dos métodos foi mantido seguindo o padrão Java, apenas para evitar confusões. 7 | 8 | Como a classe em Java foi descompilada, alguns nomes se tornaram nomes genéricos (ex: $paramString1, $paramString2). 9 | 10 | Dúvidas 11 | ============== 12 | 13 | Caso tenha alguma dúvida, crie uma issue nesse repositório. Algumas pessoas me contactaram pelas redes sociais, porém fica mais fácil deixarmos documentadas as perguntas/respostas aqui no Github, assim ajudamos mais pessoas. 14 | 15 | Criei essa biblioteca em 2013 para um pequeno e-commerce, sem a ajuda do Itaú ou qualquer relação com eles, por isso, não consigo fornecer suporte para mensagens de erro do backend deles, somente para a forma como deve ser utilizada essa biblioteca (e espero que ainda esteja funcionando). 16 | 17 | Como Usar 18 | ============== 19 | 20 | Após o cliente preencher os dados, criptografe eles utilizando o seguinte código: 21 | 22 | ```php 23 | include "Itaucripto.php"; 24 | 25 | $cripto = new Itaucripto(); 26 | 27 | //Coloque o código da empresa em MAIÚSCULO 28 | $codEmp = "J1234567890123456789012345"; 29 | //Coloque a chave de criptografia em MAIÚSCULO 30 | $chave = "ABCD123456ABCD12"; 31 | 32 | //Preencha as variáveis abaixo com os dados do cliente e da cobrança 33 | //Abaixo é só um exemplo! 34 | $pedido = "1234"; 35 | $valor = "150,00"; 36 | $observacao = ""; 37 | $nomeSacado = "José Pereira"; 38 | $codigoInscricao = ""; 39 | $numeroInscricao = ""; 40 | $enderecoSacado = ""; 41 | $bairroSacado = ""; 42 | $cepSacado = ""; 43 | $cidadeSacado = ""; 44 | $estadoSacado = ""; 45 | $dataVencimento = ""; 46 | $urlRetorna = ""; 47 | $obsAd1 = ""; 48 | $obsAd2 = ""; 49 | $obsAd3 = ""; 50 | 51 | $dados_criptografados = $cripto->geraDados($codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado, 52 | $codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado, 53 | $dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3); 54 | ``` 55 | 56 | Campos 57 | ============== 58 | 59 | ```php 60 | $pedido // Identificação do pedido - máximo de 8 dígitos (12345678) - Obrigatório 61 | $valor // Valor do pedido - máximo de 8 dígitos + vírgula + 2 dígitos - 99999999,99 - Obrigatório 62 | $observacao // Observações - máximo de 40 caracteres 63 | $nomeSacado // Nome do sacado - máximo de 30 caracteres 64 | $codigoInscricao // Código de Inscrição: 01->CPF, 02->CNPJ 65 | $numeroInscricao // Número de Inscrição: CPF ou CNPJ - até 14 caracteres 66 | $enderecoSacado // Endereco do Sacado - máximo de 40 caracteres 67 | $bairroSacado // Bairro do Sacado - máximo de 15 caracteres 68 | $cepSacado // Cep do Sacado - máximo de 8 dígitos 69 | $cidadeSacado // Cidade do sacado - máximo 15 caracteres 70 | $estadoSacado // Estado do Sacado - 2 caracteres 71 | $dataVencimento // Vencimento do título - 8 dígitos - ddmmaaaa 72 | $urlRetorna // URL do retorno - máximo de 60 caracteres 73 | $obsAdicional1 // ObsAdicional1 - máximo de 60 caracteres 74 | $obsAdicional2 // ObsAdicional2 - máximo de 60 caracteres 75 | $obsAdicional3 // ObsAdicional3 - máximo de 60 caracteres 76 | ``` 77 | 78 | Changelog 79 | ============== 80 | 81 | * v0.1 - 30 de Janeiro de 2013 82 | 83 | Classe Java descompilada e traduzida para PHP 84 | 85 | * v0.2 - 01 de Fevereiro de 2013 86 | 87 | Correções na função Algoritimo e Inicializa 88 | 89 | Teste feito em ambiente de produção, geração de dados criptografados validada pelo Itaú Shopline 90 | 91 | * v0.3 - 17 de Outubro de 2013 92 | 93 | Correções na função Algoritimo - A chave de criptografia precisa estar sempre em maiúsculo, colocada função strtoupper para facilitar 94 | 95 | Agora a decripto funciona corretamente 96 | 97 | * v0.4 - 28 de Maio de 2014 98 | 99 | Correção do uso da função substr dentro da função decripto. (Obrigado Jorge Marmion e lucaspacheco). 100 | 101 | 102 | Author 103 | ============== 104 | 105 | [R3C Web](http://www.r3c.com.br) 106 | 107 | [@gabrielrcouto](http://www.twitter.com/gabrielrcouto) 108 | 109 | Licença 110 | ============== 111 | 112 | [MIT License](http://zenorocha.mit-license.org/) 113 | 114 | 115 | -------------------------------------------------------------------------------- /documentação Itaú/ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabrielrcouto/php-itaucripto/f4b15fc7214684d1ad7be60fbcad2aa9d6cbcb6f/documentação Itaú/ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf -------------------------------------------------------------------------------- /documentação Itaú/Itaucripto.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabrielrcouto/php-itaucripto/f4b15fc7214684d1ad7be60fbcad2aa9d6cbcb6f/documentação Itaú/Itaucripto.class -------------------------------------------------------------------------------- /documentação Itaú/Itaucripto.java: -------------------------------------------------------------------------------- 1 | package Itau; 2 | 3 | public class Itaucripto 4 | { 5 | private int[] sbox; 6 | private int[] key; 7 | private String codEmp; 8 | private String numPed; 9 | private String tipPag; 10 | private String CHAVE_ITAU = "SEGUNDA12345ITAU"; 11 | private int TAM_COD_EMP = 26; 12 | private int TAM_CHAVE = 16; 13 | private String dados; 14 | public String numbers = "0123456789"; 15 | 16 | public Itaucripto() 17 | { 18 | this.sbox = new int[256]; 19 | this.key = new int[256]; 20 | 21 | this.numPed = ""; 22 | this.tipPag = ""; 23 | this.codEmp = ""; 24 | } 25 | 26 | private String Algoritmo(String paramString1, String paramString2) 27 | { 28 | int k = 0; 29 | int m = 0; 30 | 31 | String str = ""; 32 | Inicializa(paramString2); 33 | 34 | for (int j = 1; j <= paramString1.length(); j++) { 35 | k = (k + 1) % 256; 36 | m = (m + this.sbox[k]) % 256; 37 | int i = this.sbox[k]; 38 | this.sbox[k] = this.sbox[m]; 39 | this.sbox[m] = i; 40 | 41 | int n = this.sbox[((this.sbox[k] + this.sbox[m]) % 256)]; 42 | 43 | int i1 = paramString1.charAt(j - 1) ^ n; 44 | str = str + (char)i1; 45 | } 46 | return str; 47 | } 48 | 49 | private String PreencheBranco(String paramString, int paramInt) 50 | { 51 | String str = paramString.toString(); 52 | while (str.length() < paramInt) 53 | str = str + " "; 54 | return str.substring(0, paramInt); 55 | } 56 | 57 | private String PreencheZero(String paramString, int paramInt) 58 | { 59 | String str = paramString.toString(); 60 | while (str.length() < paramInt) 61 | str = "0" + str; 62 | return str.substring(0, paramInt); 63 | } 64 | 65 | private void Inicializa(String paramString) 66 | { 67 | int m = paramString.length(); 68 | for (int j = 0; j <= 255; j++) { 69 | this.key[j] = paramString.charAt(j % m); 70 | this.sbox[j] = j; 71 | } 72 | 73 | int k = 0; 74 | for (j = 0; j <= 255; j++) { 75 | k = (k + this.sbox[j] + this.key[j]) % 256; 76 | int i = this.sbox[j]; 77 | this.sbox[j] = this.sbox[k]; 78 | this.sbox[k] = i; 79 | } 80 | } 81 | 82 | private boolean isNumeric(String paramString) 83 | { 84 | if (paramString.length() > 1) { 85 | boolean bool = true; 86 | for (int i = 0; i < paramString.length(); i++) 87 | { 88 | bool = isNumeric(paramString.substring(i, i + 1)); 89 | if (!bool) return bool; 90 | } 91 | return bool; 92 | } 93 | 94 | if (this.numbers.indexOf(paramString) >= 0) return true; 95 | return false; 96 | } 97 | 98 | private String Converte(String paramString) 99 | { 100 | char c = (char)(int)(26.0D * Math.random() + 65.0D); 101 | String str = "" + c; 102 | 103 | for (int i = 0; i < paramString.length(); i++) 104 | { 105 | int k = paramString.charAt(i); 106 | 107 | int j = k; 108 | 109 | str = str + Integer.toString(j); 110 | c = (char)(int)(26.0D * Math.random() + 65.0D); 111 | str = str + c; 112 | } 113 | return str; 114 | } 115 | 116 | private String Desconverte(String paramString) 117 | { 118 | String str1 = ""; 119 | 120 | for (int i = 0; i < paramString.length(); i++) { 121 | String str2 = ""; 122 | 123 | char c = paramString.charAt(i); 124 | 125 | while (Character.isDigit(c)) { 126 | str2 = str2 + paramString.charAt(i); 127 | i += 1; 128 | c = paramString.charAt(i); 129 | } 130 | 131 | if (str2.compareTo("") != 0) { 132 | int j = Integer.parseInt(str2); 133 | str1 = str1 + (char)j; 134 | } 135 | } 136 | return str1; 137 | } 138 | 139 | public String geraDados(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, String paramString6, String paramString7, String paramString8, String paramString9, String paramString10, String paramString11, String paramString12, String paramString13, String paramString14, String paramString15, String paramString16, String paramString17, String paramString18) 140 | { 141 | paramString1 = paramString1.toUpperCase(); 142 | paramString5 = paramString5.toUpperCase(); 143 | 144 | if (paramString1.length() != this.TAM_COD_EMP) 145 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 146 | if (paramString5.length() != this.TAM_CHAVE) 147 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 148 | if ((paramString2.length() < 1) || (paramString2.length() > 8)) { 149 | return "Erro: número do pedido inválido."; 150 | } 151 | if (isNumeric(paramString2)) 152 | paramString2 = PreencheZero(paramString2, 8); 153 | else { 154 | return "Erro: numero do pedido não é numérico."; 155 | } 156 | if ((paramString3.length() < 1) || (paramString3.length() > 11)) { 157 | return "Erro: valor da compra inválido."; 158 | } 159 | 160 | int i = paramString3.indexOf(','); 161 | if (i != -1) 162 | { 163 | String str3 = paramString3.substring(i + 1); 164 | if (!isNumeric(str3)) 165 | return "Erro: valor decimal não é numérico."; 166 | if (str3.length() != 2) { 167 | return "Erro: valor decimal da compra deve possuir 2 posições após a virgula."; 168 | } 169 | paramString3 = paramString3.substring(0, paramString3.length() - 3) + str3; 170 | } 171 | else 172 | { 173 | if (!isNumeric(paramString3)) { 174 | return "Erro: valor da compra não é numérico."; 175 | } 176 | if (paramString3.length() > 8) { 177 | return "Erro: valor da compra deve possuir no máximo 8 posições antes da virgula."; 178 | } 179 | 180 | paramString3 = paramString3 + "00"; 181 | } 182 | paramString3 = PreencheZero(paramString3, 10); 183 | 184 | paramString7 = paramString7.trim(); 185 | if ((paramString7.compareTo("02") != 0) && (paramString7.compareTo("01") != 0) && (paramString7.compareTo("") != 0)) 186 | return "Erro: código de inscrição inválido."; 187 | if ((paramString8.compareTo("") != 0) && (!isNumeric(paramString8)) && (paramString8.length() > 14)) { 188 | return "Erro: número de inscrição inválido."; 189 | } 190 | 191 | if ((paramString11.compareTo("") != 0) && ((!isNumeric(paramString11)) || (paramString11.length() != 8))) { 192 | return "Erro: cep inválido."; 193 | } 194 | 195 | if ((paramString14.compareTo("") != 0) && ((!isNumeric(paramString14)) || (paramString14.length() != 8))) 196 | return "Erro: data de vencimento inválida."; 197 | if (paramString16.length() > 60) 198 | { 199 | return "Erro: observação adicional 1 inválida."; 200 | } 201 | if (paramString17.length() > 60) 202 | { 203 | return "Erro: observação adicional 2 inválida."; 204 | } 205 | if (paramString18.length() > 60) 206 | { 207 | return "Erro: observação adicional 3 inválida."; 208 | } 209 | 210 | paramString4 = PreencheBranco(paramString4, 40); 211 | paramString6 = PreencheBranco(paramString6, 30); 212 | paramString7 = PreencheBranco(paramString7, 2); 213 | paramString8 = PreencheBranco(paramString8, 14); 214 | paramString9 = PreencheBranco(paramString9, 40); 215 | paramString10 = PreencheBranco(paramString10, 15); 216 | paramString11 = PreencheBranco(paramString11, 8); 217 | paramString12 = PreencheBranco(paramString12, 15); 218 | paramString13 = PreencheBranco(paramString13, 2); 219 | paramString14 = PreencheBranco(paramString14, 8); 220 | paramString15 = PreencheBranco(paramString15, 60); 221 | paramString16 = PreencheBranco(paramString16, 60); 222 | paramString17 = PreencheBranco(paramString17, 60); 223 | paramString18 = PreencheBranco(paramString18, 60); 224 | 225 | String str1 = Algoritmo(paramString2 + paramString3 + paramString4 + paramString6 + paramString7 + paramString8 + paramString9 + paramString10 + paramString11 + paramString12 + paramString13 + paramString14 + paramString15 + paramString16 + paramString17 + paramString18, paramString5); 226 | 227 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 228 | 229 | return Converte(str2); 230 | } 231 | 232 | public String geraCripto(String paramString1, String paramString2, String paramString3) 233 | { 234 | if (paramString1.length() != this.TAM_COD_EMP) 235 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 236 | if (paramString3.length() != this.TAM_CHAVE) 237 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 238 | paramString2 = paramString2.trim(); 239 | if (paramString2.compareTo("") == 0) { 240 | return "Erro: código do sacado inválido."; 241 | } 242 | 243 | String str1 = Algoritmo(paramString2, paramString3); 244 | 245 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 246 | 247 | return Converte(str2); 248 | } 249 | 250 | public String geraConsulta(String paramString1, String paramString2, String paramString3, String paramString4) 251 | { 252 | if (paramString1.length() != this.TAM_COD_EMP) 253 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 254 | if (paramString4.length() != this.TAM_CHAVE) 255 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 256 | if ((paramString2.length() < 1) || (paramString2.length() > 8)) { 257 | return "Erro: número do pedido inválido."; 258 | } 259 | if (isNumeric(paramString2)) 260 | paramString2 = PreencheZero(paramString2, 8); 261 | else 262 | return "Erro: numero do pedido não é numérico."; 263 | if ((paramString3.compareTo("0") != 0) && (paramString3.compareTo("1") != 0)) { 264 | return "Erro: formato inválido."; 265 | } 266 | 267 | String str1 = Algoritmo(paramString2 + paramString3, paramString4); 268 | 269 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 270 | 271 | return Converte(str2); 272 | } 273 | 274 | public String decripto(String paramString1, String paramString2) 275 | { 276 | paramString1 = Desconverte(paramString1); 277 | String str = Algoritmo(paramString1, paramString2); 278 | 279 | this.codEmp = str.substring(0, 26); 280 | 281 | this.numPed = str.substring(26, 34); 282 | 283 | this.tipPag = str.substring(34, 36); 284 | return str; 285 | } 286 | 287 | public String retornaCodEmp() 288 | { 289 | return this.codEmp; 290 | } 291 | 292 | public String retornaPedido() 293 | { 294 | return this.numPed; 295 | } 296 | 297 | public String retornaTipPag() 298 | { 299 | return this.tipPag; 300 | } 301 | 302 | public String geraDadosGenerico(String paramString1, String paramString2, String paramString3) 303 | { 304 | paramString1 = paramString1.toUpperCase(); 305 | paramString3 = paramString3.toUpperCase(); 306 | 307 | if (paramString1.length() != this.TAM_COD_EMP) 308 | { 309 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 310 | } 311 | if (paramString3.length() != this.TAM_CHAVE) 312 | { 313 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 314 | } 315 | if (paramString2.length() < 1) 316 | { 317 | return "Erro: sem dados."; 318 | } 319 | 320 | String str1 = Algoritmo(paramString2, paramString3); 321 | 322 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 323 | 324 | return Converte(str2); 325 | } 326 | } -------------------------------------------------------------------------------- /documentação Itaú/ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabrielrcouto/php-itaucripto/f4b15fc7214684d1ad7be60fbcad2aa9d6cbcb6f/documentação Itaú/ITAUSHOPLINE_MANUAL_TECNICO_DEZ_11.pdf -------------------------------------------------------------------------------- /documentação Itaú/Itaucripto.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabrielrcouto/php-itaucripto/f4b15fc7214684d1ad7be60fbcad2aa9d6cbcb6f/documentação Itaú/Itaucripto.class -------------------------------------------------------------------------------- /documentação Itaú/Itaucripto.java: -------------------------------------------------------------------------------- 1 | package Itau; 2 | 3 | public class Itaucripto 4 | { 5 | private int[] sbox; 6 | private int[] key; 7 | private String codEmp; 8 | private String numPed; 9 | private String tipPag; 10 | private String CHAVE_ITAU = "SEGUNDA12345ITAU"; 11 | private int TAM_COD_EMP = 26; 12 | private int TAM_CHAVE = 16; 13 | private String dados; 14 | public String numbers = "0123456789"; 15 | 16 | public Itaucripto() 17 | { 18 | this.sbox = new int[256]; 19 | this.key = new int[256]; 20 | 21 | this.numPed = ""; 22 | this.tipPag = ""; 23 | this.codEmp = ""; 24 | } 25 | 26 | private String Algoritmo(String paramString1, String paramString2) 27 | { 28 | int k = 0; 29 | int m = 0; 30 | 31 | String str = ""; 32 | Inicializa(paramString2); 33 | 34 | for (int j = 1; j <= paramString1.length(); j++) { 35 | k = (k + 1) % 256; 36 | m = (m + this.sbox[k]) % 256; 37 | int i = this.sbox[k]; 38 | this.sbox[k] = this.sbox[m]; 39 | this.sbox[m] = i; 40 | 41 | int n = this.sbox[((this.sbox[k] + this.sbox[m]) % 256)]; 42 | 43 | int i1 = paramString1.charAt(j - 1) ^ n; 44 | str = str + (char)i1; 45 | } 46 | return str; 47 | } 48 | 49 | private String PreencheBranco(String paramString, int paramInt) 50 | { 51 | String str = paramString.toString(); 52 | while (str.length() < paramInt) 53 | str = str + " "; 54 | return str.substring(0, paramInt); 55 | } 56 | 57 | private String PreencheZero(String paramString, int paramInt) 58 | { 59 | String str = paramString.toString(); 60 | while (str.length() < paramInt) 61 | str = "0" + str; 62 | return str.substring(0, paramInt); 63 | } 64 | 65 | private void Inicializa(String paramString) 66 | { 67 | int m = paramString.length(); 68 | for (int j = 0; j <= 255; j++) { 69 | this.key[j] = paramString.charAt(j % m); 70 | this.sbox[j] = j; 71 | } 72 | 73 | int k = 0; 74 | for (j = 0; j <= 255; j++) { 75 | k = (k + this.sbox[j] + this.key[j]) % 256; 76 | int i = this.sbox[j]; 77 | this.sbox[j] = this.sbox[k]; 78 | this.sbox[k] = i; 79 | } 80 | } 81 | 82 | private boolean isNumeric(String paramString) 83 | { 84 | if (paramString.length() > 1) { 85 | boolean bool = true; 86 | for (int i = 0; i < paramString.length(); i++) 87 | { 88 | bool = isNumeric(paramString.substring(i, i + 1)); 89 | if (!bool) return bool; 90 | } 91 | return bool; 92 | } 93 | 94 | if (this.numbers.indexOf(paramString) >= 0) return true; 95 | return false; 96 | } 97 | 98 | private String Converte(String paramString) 99 | { 100 | char c = (char)(int)(26.0D * Math.random() + 65.0D); 101 | String str = "" + c; 102 | 103 | for (int i = 0; i < paramString.length(); i++) 104 | { 105 | int k = paramString.charAt(i); 106 | 107 | int j = k; 108 | 109 | str = str + Integer.toString(j); 110 | c = (char)(int)(26.0D * Math.random() + 65.0D); 111 | str = str + c; 112 | } 113 | return str; 114 | } 115 | 116 | private String Desconverte(String paramString) 117 | { 118 | String str1 = ""; 119 | 120 | for (int i = 0; i < paramString.length(); i++) { 121 | String str2 = ""; 122 | 123 | char c = paramString.charAt(i); 124 | 125 | while (Character.isDigit(c)) { 126 | str2 = str2 + paramString.charAt(i); 127 | i += 1; 128 | c = paramString.charAt(i); 129 | } 130 | 131 | if (str2.compareTo("") != 0) { 132 | int j = Integer.parseInt(str2); 133 | str1 = str1 + (char)j; 134 | } 135 | } 136 | return str1; 137 | } 138 | 139 | public String geraDados(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5, String paramString6, String paramString7, String paramString8, String paramString9, String paramString10, String paramString11, String paramString12, String paramString13, String paramString14, String paramString15, String paramString16, String paramString17, String paramString18) 140 | { 141 | paramString1 = paramString1.toUpperCase(); 142 | paramString5 = paramString5.toUpperCase(); 143 | 144 | if (paramString1.length() != this.TAM_COD_EMP) 145 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 146 | if (paramString5.length() != this.TAM_CHAVE) 147 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 148 | if ((paramString2.length() < 1) || (paramString2.length() > 8)) { 149 | return "Erro: número do pedido inválido."; 150 | } 151 | if (isNumeric(paramString2)) 152 | paramString2 = PreencheZero(paramString2, 8); 153 | else { 154 | return "Erro: numero do pedido não é numérico."; 155 | } 156 | if ((paramString3.length() < 1) || (paramString3.length() > 11)) { 157 | return "Erro: valor da compra inválido."; 158 | } 159 | 160 | int i = paramString3.indexOf(','); 161 | if (i != -1) 162 | { 163 | String str3 = paramString3.substring(i + 1); 164 | if (!isNumeric(str3)) 165 | return "Erro: valor decimal não é numérico."; 166 | if (str3.length() != 2) { 167 | return "Erro: valor decimal da compra deve possuir 2 posições após a virgula."; 168 | } 169 | paramString3 = paramString3.substring(0, paramString3.length() - 3) + str3; 170 | } 171 | else 172 | { 173 | if (!isNumeric(paramString3)) { 174 | return "Erro: valor da compra não é numérico."; 175 | } 176 | if (paramString3.length() > 8) { 177 | return "Erro: valor da compra deve possuir no máximo 8 posições antes da virgula."; 178 | } 179 | 180 | paramString3 = paramString3 + "00"; 181 | } 182 | paramString3 = PreencheZero(paramString3, 10); 183 | 184 | paramString7 = paramString7.trim(); 185 | if ((paramString7.compareTo("02") != 0) && (paramString7.compareTo("01") != 0) && (paramString7.compareTo("") != 0)) 186 | return "Erro: código de inscrição inválido."; 187 | if ((paramString8.compareTo("") != 0) && (!isNumeric(paramString8)) && (paramString8.length() > 14)) { 188 | return "Erro: número de inscrição inválido."; 189 | } 190 | 191 | if ((paramString11.compareTo("") != 0) && ((!isNumeric(paramString11)) || (paramString11.length() != 8))) { 192 | return "Erro: cep inválido."; 193 | } 194 | 195 | if ((paramString14.compareTo("") != 0) && ((!isNumeric(paramString14)) || (paramString14.length() != 8))) 196 | return "Erro: data de vencimento inválida."; 197 | if (paramString16.length() > 60) 198 | { 199 | return "Erro: observação adicional 1 inválida."; 200 | } 201 | if (paramString17.length() > 60) 202 | { 203 | return "Erro: observação adicional 2 inválida."; 204 | } 205 | if (paramString18.length() > 60) 206 | { 207 | return "Erro: observação adicional 3 inválida."; 208 | } 209 | 210 | paramString4 = PreencheBranco(paramString4, 40); 211 | paramString6 = PreencheBranco(paramString6, 30); 212 | paramString7 = PreencheBranco(paramString7, 2); 213 | paramString8 = PreencheBranco(paramString8, 14); 214 | paramString9 = PreencheBranco(paramString9, 40); 215 | paramString10 = PreencheBranco(paramString10, 15); 216 | paramString11 = PreencheBranco(paramString11, 8); 217 | paramString12 = PreencheBranco(paramString12, 15); 218 | paramString13 = PreencheBranco(paramString13, 2); 219 | paramString14 = PreencheBranco(paramString14, 8); 220 | paramString15 = PreencheBranco(paramString15, 60); 221 | paramString16 = PreencheBranco(paramString16, 60); 222 | paramString17 = PreencheBranco(paramString17, 60); 223 | paramString18 = PreencheBranco(paramString18, 60); 224 | 225 | String str1 = Algoritmo(paramString2 + paramString3 + paramString4 + paramString6 + paramString7 + paramString8 + paramString9 + paramString10 + paramString11 + paramString12 + paramString13 + paramString14 + paramString15 + paramString16 + paramString17 + paramString18, paramString5); 226 | 227 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 228 | 229 | return Converte(str2); 230 | } 231 | 232 | public String geraCripto(String paramString1, String paramString2, String paramString3) 233 | { 234 | if (paramString1.length() != this.TAM_COD_EMP) 235 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 236 | if (paramString3.length() != this.TAM_CHAVE) 237 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 238 | paramString2 = paramString2.trim(); 239 | if (paramString2.compareTo("") == 0) { 240 | return "Erro: código do sacado inválido."; 241 | } 242 | 243 | String str1 = Algoritmo(paramString2, paramString3); 244 | 245 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 246 | 247 | return Converte(str2); 248 | } 249 | 250 | public String geraConsulta(String paramString1, String paramString2, String paramString3, String paramString4) 251 | { 252 | if (paramString1.length() != this.TAM_COD_EMP) 253 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 254 | if (paramString4.length() != this.TAM_CHAVE) 255 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 256 | if ((paramString2.length() < 1) || (paramString2.length() > 8)) { 257 | return "Erro: número do pedido inválido."; 258 | } 259 | if (isNumeric(paramString2)) 260 | paramString2 = PreencheZero(paramString2, 8); 261 | else 262 | return "Erro: numero do pedido não é numérico."; 263 | if ((paramString3.compareTo("0") != 0) && (paramString3.compareTo("1") != 0)) { 264 | return "Erro: formato inválido."; 265 | } 266 | 267 | String str1 = Algoritmo(paramString2 + paramString3, paramString4); 268 | 269 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 270 | 271 | return Converte(str2); 272 | } 273 | 274 | public String decripto(String paramString1, String paramString2) 275 | { 276 | paramString1 = Desconverte(paramString1); 277 | String str = Algoritmo(paramString1, paramString2); 278 | 279 | this.codEmp = str.substring(0, 26); 280 | 281 | this.numPed = str.substring(26, 34); 282 | 283 | this.tipPag = str.substring(34, 36); 284 | return str; 285 | } 286 | 287 | public String retornaCodEmp() 288 | { 289 | return this.codEmp; 290 | } 291 | 292 | public String retornaPedido() 293 | { 294 | return this.numPed; 295 | } 296 | 297 | public String retornaTipPag() 298 | { 299 | return this.tipPag; 300 | } 301 | 302 | public String geraDadosGenerico(String paramString1, String paramString2, String paramString3) 303 | { 304 | paramString1 = paramString1.toUpperCase(); 305 | paramString3 = paramString3.toUpperCase(); 306 | 307 | if (paramString1.length() != this.TAM_COD_EMP) 308 | { 309 | return "Erro: tamanho do codigo da empresa diferente de 26 posições."; 310 | } 311 | if (paramString3.length() != this.TAM_CHAVE) 312 | { 313 | return "Erro: tamanho da chave da chave diferente de 16 posições."; 314 | } 315 | if (paramString2.length() < 1) 316 | { 317 | return "Erro: sem dados."; 318 | } 319 | 320 | String str1 = Algoritmo(paramString2, paramString3); 321 | 322 | String str2 = Algoritmo(paramString1 + str1, this.CHAVE_ITAU); 323 | 324 | return Converte(str2); 325 | } 326 | } -------------------------------------------------------------------------------- /teste.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabrielrcouto/php-itaucripto/f4b15fc7214684d1ad7be60fbcad2aa9d6cbcb6f/teste.php --------------------------------------------------------------------------------