Not even a floodlight failure that stopped play for half an hour on Sunday could affect Rohit, who hit seven sixes and 12 fours in his 119 off 90 balls as the hosts chased down a 305-run target in 44.3 overs.
Earlier, England's 304 all out, with one delivery left in their innings, appeared a strong total, also vindicating their decision to bat first at Barabati Stadium.
Ben Duckett (65) and Joe Root (69) smashed half-centuries and England looked poised for a big total when cruising at 3-219 in the 39th over.
They already had a flying start after Duckett and Phil Salt (26) combined in a rollicking 81-run opening stand.
Duckett raced to a 36-ball fifty but Ravindra Jadeja struck in his first over, dismissing the opener.
Harry Brook (31) could not capitalise on the start but with Root and skipper Jos Buttler (34) in the middle, England looked primed to launch a late assault.
India, however, fought back with the ball removing both the set batters and England suddenly slumped to 272-7 in the 48th over.
Liam Livingstone (41) produced a 32-ball cameo to take England past the 300-mark before he and Mark Wood were run out in successive deliveries.
For India, Jadeja claimed 3-35, took a catch and fired a throw from the deep that led to Adil Rashid being run out.
Rohit, who has been struggling for runs both in Tests and ODIs, led India's reply with a barrage of boundaries - the sweet sound of bat whacking the ball announcing his return to form.
Rohit began with a streaky four against Gus Atkinson before finding the middle of his bat and racing to a 30-ball 50.
At the other end, Shubman Gill (60) took the aerial route only once and hit nine fours in his fluent knock.
Jamie Overton yorked Gill to end the rapid 136-run opening stand and Rashid dismissed Virat Kohli caught behind for five, but Rohit went on a rampage.
Rohit brought up his 32nd ODI hundred in style, hitting Rashid for a six.
Rashid then took a brilliant tumbling catch to dismiss Rohit, who mishit a full toss from Livingstone.
Shreyas Iyer scored a fluent 44 but his run-out, soon followed by the dismissals of KL Rahul and Hardik Pandya, meant India could not take anything for granted.
Axar Patel, who made 41 not out, dashed any English hopes of a series-levelling victory.
England's Jacob Bethell missed the match with a hamstring injury, which makes the batting allrounder uncertain for the Champions Trophy, with England having drafted in Tom Banton in as cover.
The teams move to Ahmedabad for the final ODI on Wednesday, with India already having won the preceding T20 series between the sides 4-1.